Як перенаправити висновок PowerShell у файл під час його виконання


198

У мене є сценарій PowerShell, для якого я хотів би перенаправити вихід у файл. Проблема полягає в тому, що я не можу змінити спосіб виклику цього скрипту. Тому я не можу:

 .\MyScript.ps1 > output.txt

Як я перенаправляю висновок сценарію PowerShell під час його виконання?

Відповіді:


192

Можливо Start-Transcript, спрацювало б для вас. Спочатку зупиніть його, якщо він вже запущений, а потім запустіть його та припиніть, коли будете готові.

$ ErrorActionPreference = "SilentlyContinue"
Стоп-стенограма | поза нуля
$ ErrorActionPreference = "Продовжити"
Пуск-стенограма-шлях С: \ вихід.txt -додаток
# Робіть якісь речі
Стоп-стенограма

Ви також можете виконати цю роботу під час роботи над матеріалами та зберегти її сеанси командного рядка для подальшого ознайомлення.

Якщо ви хочете повністю придушити помилку під час спроби зупинити стенограму, яка не транскрибує, ви можете зробити це:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
Зауважте, що стартовий стенограма не записує Write-Error, Write-Verbose або Write-Debug ... лише стандартний вихід.
Річард Берг

6
@richard: це, здається, робиться зараз. Можливо, це додаток 2.0, не впевнений, чи всі ці відповіді стосуються 1,0.
Robert S Ciaccio

Я використовую майже той самий код вище. моя проблема полягає в тому, що Stop-Transcript | out-null все ще надсилає вихід помилок, якщо транскрипція не запущена. Мені потрібно придушити повідомлення, оскільки воно зіпсує мій макет. -замовлення беззвучно тривати також не допомагає. якісь ідеї?
Мел

4
Нарешті, я знайшов документи для Start-Transcript . (розчарування не позначено номером версії Powershell). У ній написано: "Стенограма включає всі команди, які користувач вводить, і весь вихід, який з'являється на консолі". Однак я перевірив Start-Transcript в Powershell 2.0 і виявив, що @Richard має рацію, стандартна помилка не зберігається в стенограмі. Це смокче!
Полковник Паніка

Цей метод не попереджає вас, якщо ви дійсно маєте дозвіл на запис у вказане місце.
демонголем

51

Microsoft оголосила на веб-сайті Powershell Connections (2012-02-15 о 16:40), що у версії 3.0 вони розширили перенаправлення як рішення цієї проблеми.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Детальну інформацію та приклади див. У довідковій статті "about_Redirection".

help about_Redirection

1
Не кажучи, що мені подобається це рішення. Насправді я вважаю це потворним, важко запам’ятовувати і негнучким. Схоже, додавання параметрів зйомки потоку до Cmdlets Out-*, Set-Content та Add-Content зробило б трюк у більш потужному режимі Powershelly. Поки вони є, вони також повинні додати параметр -PassThru. Що фактично зробить менш корисним Tee-Object Cmdlet застарілим.
Натан Хартлі

Я розгублений, як це відповідає на поставлене запитання? "Як я переспрямовую висновок сценарію PowerShell під час його виконання?"
Zoredache

Ви маєте рацію, @Zoredache, я, здається, не помітив вимоги "не можу змінити спосіб називання цього сценарію". Захоплюючи більшість результатів, шлях - Start-Transcript - це шлях. Чи потрібно видалити цю відповідь?
Натан Хартлі

1
Для тих, хто приходить сюди для загального перенаправлення, з того часу Powershell додав -OutVariable -WarningVariable -ErrorVariable, що безпосередньо відповідає на мій коментар 3 січня 14 січня.
Натан Хартлі

2
Ні, прекрасно це залишити. Зважаючи на кількість голосів, які голосують, це очевидно корисно. Це питання майже напевно - це отримання звернень Google від людей, які можуть змінити спосіб виклику сценарію.
Zoredache

36

Використання:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
не вирішує питання ОП, оскільки воно не працює "під час виконання". Але я дав це +1, тому що в будь-якому разі корисно знати, як робити трубу в Powershell.
Пол Масрі-Стоун

28

Я вважаю, ви можете змінити MyScript.ps1. Потім спробуйте це змінити так:

$(
    Here is your current script
) *>&1 > output.txt

Я щойно спробував це з PowerShell 3. Ви можете використовувати всі параметри переадресації, як у відповіді Натана Хартлі .


Мені подобається це рішення. Ви можете використовувати >> output.txt для додавання. Хто-небудь знає, чи є спосіб створити цю команду ascii замість unicode?
Проф. Фон Лемонгорг

1
Ви можете спробувати щось подібне: *>&1 | Out-File $log -Encoding ascii -Append -Width 132але Powershell справді некрасивий, якщо вам потрібно точно контролювати вихід.
mplwork

Я вважаю за краще це, як це працює у вашому сценарії. Ідеально підходить для бродяжних.
user3505901

25

Одне можливе рішення, якщо ваша ситуація дозволяє:

  1. Перейменуйте MyScript.ps1 на TheRealMyScript.ps1
  2. Створіть новий MyScript.ps1, який виглядає так:

    . \ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
Це був єдиний із багатьох варіантів, які працювали на вихід мого сценарію.
cori

17

Ви можете поглянути на командлет Tee-Object . Ви можете передавати вихід у Tee, і він запише в конвеєр, а також у файл


1
"вихід" | Set-Content -PassThru і "вихід" | Add-Content -PassThru також буде працювати як Tee-Object, з додатковою перевагою, яку ви можете встановити Encoding.
Натан Хартлі

16

Якщо ви хочете пряме переспрямування всього виводу у файл, спробуйте скористатися *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Оскільки це пряме переспрямування на файл, воно не виводиться на консоль (часто корисно). Якщо ви хочете вивести консоль, комбінуйте весь вихід з *&>1, а потім з трубкоюTee-Object :

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Я вважаю, що ці методи підтримуються в PowerShell 3.0 або новіших версіях; Я тестую на PowerShell 5.0.


4

Якщо ви хочете зробити це з командного рядка, а не вбудований у сам сценарій, використовуйте:

.\myscript.ps1 | Out-File c:\output.csv

7
Запитувач чітко пояснює, що виклик скрипта неможливо змінити.
Фер

2
Не пов'язане з питанням, але корисно для мене, я гуглився, щоб отримати правильний синтаксис з трубою в Out-File.
gReX

0

Щоб вставити це у свій сценарій, ви можете це зробити так:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Це повинно зробити трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.