2010-06-09 2 views
22

Я пытаюсь записать весь вывод (включая ошибки) исполняющего скрипта в консоль и файл одновременно. Я пробовал несколько разных вариантов:Запись ошибок и вывод в текстовый файл и консоль

.\MyScript.ps1 | tee -filePath C:\results.txt # only the output to the file 
.\MyScript.ps1 2> C:\results.txt # only the errors to the file and not the console 
.\MyScript.ps1 > C:\results.txt # only the output to the file and not the console 

Надеюсь, что я могу использовать этот файл для просмотра результатов/ошибок.

EDIT:

Это мой текущий тестовый скрипт. Желаемые результаты состоят в том, что все три сообщения можно увидеть.

function Test-Error 
{ 
    echo "echo" 
    Write-Warning "warning" 
    Write-Error "error"  
} 

Test-Error 2>&1 | tee -filePath c:\results.txt 
+0

@JasonMArcher благодарит за обновление тегов по этому вопросу! Есть ли что-то дополнительное, что мы должны делать, поскольку оно исправлено в V3, и я изначально использовал V2? Благодарю. – smaclell

+0

Это зависит от того, нужны ли только ответы на V2? Это не проблема, характерная для V2. Таким образом, наилучшей идеей является предпочтение фактических ответов с версией PowerShell, для которой они предназначены. :) – JasonMArcher

+1

Я добавил несколько замечаний к существующим ответам о совместимости версий PS. – JasonMArcher

ответ

19

Вы пробовали:

.\MyScript.ps1 2>&1 | tee -filePath c:\results.txt 

2>&1 является то, что вы ищете

Примечание: Этот ответ отлично работает в PowerShell 1.0 и 2.0, но будет захватывать только стандартный вывод и ошибки в PowerShell 3.0 и более поздних версиях.

+0

Это очень близко. Я добавил скрипт, который я использую, чтобы проверить свою желаемую функциональность на вопрос. Он способен получать стандартный вывод и ошибки, но не предупреждения. Любые другие идеи? – smaclell

+1

У вас нет много хороших вариантов для этого. Прочтите разделы справки командлета для WRite-Warning и Write-Error, и вы увидите, что они принципиально разные. Запись-предупреждение записывается на хост, запись Write-Error записывается в выходной поток ошибки. Вы можете перенаправить потоки, но запись на хост идет на хост. Ваша единственная альтернатива - общие параметры WarningVariable и т. Д. Вы должны иметь возможность сделать все предупреждения/ошибки/выходные данные перенаправленными на переменную, используя это. Дополнительную информацию см. В разделе справки about_CommonParameters. –

+2

BTW, похоже, что вы не первый, кто столкнулся с этим. У меня, с кем я работал, есть хорошее описание проблемы здесь: http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!6926.entry –

1

Я не смог получить обе ошибки и результаты в том же файле. Обходной, который работал на меня:

.\MyScript.ps1 2> C:\errors.txt | tee -filePath C:\results.txt

Update: я работал дальше, и я использовал Start-Transcript и Stop-Transcript в моем режиме, чтобы захватить все, и это сработало!

+0

Другой ответ правильно записывает stderr и stdout в файл. Исходная проблема не была в состоянии также включать предупреждения. 'Start-Transcript' и' Stop-Transcript' очень полезны и по-прежнему заслуживают внимания. – smaclell

2

Я не был удовлетворен любой ответ, который я находил, поэтому я смешал несколько и пришел с этим (в PowerShell 3.0+):

$output = try{your_command *>&1}catch{$_} 

При этом вы можете захватить все ошибки и которые генерируются при попытке использовать your_command.

Он ловит исключения при использовании несуществующей команды:

PS C:\Users\jdgregson> $output = try{your_command *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
your_command : The term 'your_command' is not recognized as the name of a 
cmdlet, function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:15 
+ $output = try{your_command 2>&1}catch{$_} 
+    ~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (your_command:String) [], Comman 
    dNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

PS C:\Users\jdgregson> 

Он ловит исключения при передаче недопустимых аргументов существующей команды:

PS C:\Users\jdgregson> $output = try{cat C:\invalid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
cat : Cannot find path 'C:\invalid-path.txt' because it does not exist. 
At line:1 char:15 
+ $output = try{cat C:\invalid-path.txt 2>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (C:\invalid-path.txt:String) [Ge 
    t-Content], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetCo 
    ntentCommand 

И ловит, если выход есть не было никаких проблем с вашей командой:

PS C:\Users\jdgregson> $output = try{cat C:\valid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
this file is really here 

Это работает для вашей пример тоже:

PS C:\Users\jdgregson> $output = try{Test-Error *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
echo 
WARNING: warning 
Test-Error : error 
At line:1 char:15 
+ $output = try{Test-Error *>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorExcep 
    tion 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio 
    n,Test-Error 
+0

Это весело! Спасибо, что поделился. – smaclell