Как перенаправить вывод PowerShell в файл во время его выполнения - PullRequest
178 голосов
/ 01 августа 2009

У меня есть сценарий PowerShell, для которого я хотел бы перенаправить вывод в файл. Проблема в том, что я не могу изменить способ вызова этого скрипта. Поэтому я не могу сделать:

 .\MyScript.ps1 > output.txt

Как перенаправить вывод скрипта PowerShell во время его выполнения?

Ответы [ 10 ]

169 голосов
/ 01 августа 2009

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

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue"
Start-Transcript -path C:\output.txt -append
# Do some stuff
Stop-Transcript

Вы также можете запустить его во время работы над материалом и сохранить его в сеансах командной строки для дальнейшего использования.

Если вы хотите полностью устранить ошибку при попытке остановить расшифровку, которая не транскрибирует, вы можете сделать это:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"
44 голосов
/ 27 мая 2010

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
32 голосов
/ 05 ноября 2012

Использование:

Write "Stuff to write" | Out-File Outputfile.txt -Append
24 голосов
/ 01 августа 2009

Одно из возможных решений, если ваша ситуация позволяет это:

  1. Переименование MyScript.ps1 в TheRealMyScript.ps1
  2. Создайте новый MyScript.ps1, который выглядит следующим образом:

    . \ TheRealMyScript.ps1> output.txt

21 голосов
/ 11 апреля 2016

Я так понимаю, вы можете изменить MyScript.ps1. Затем попробуйте изменить это так:

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

Я только что попробовал это с PowerShell 3. Вы можете использовать все параметры перенаправления, как в Ответ Натана Хартли .

17 голосов
/ 02 августа 2009

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

12 голосов
/ 04 февраля 2017
powershell ".\MyScript.ps1" > test.log
7 голосов
/ 14 декабря 2016

Если вы хотите прямое перенаправление всех выходных данных в файл, попробуйте использовать *>>:

# 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 голосов
/ 15 октября 2014

Если вы хотите сделать это из командной строки, а не встроить в сам скрипт, используйте:

.\myscript.ps1 | Out-File c:\output.csv
0 голосов
/ 20 марта 2015

Чтобы встроить это в ваш скрипт, вы можете сделать это так:

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

Это должно сработать.

...