Запись ошибок и вывод в текстовый файл и консоль - PullRequest
26 голосов
/ 09 июня 2010

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

.\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 

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

РЕДАКТИРОВАТЬ:

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

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

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

Ответы [ 3 ]

22 голосов
/ 09 июня 2010

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

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

2>&1 это то, что вы ищете

Примечание. Этот ответ прекрасно работает в PowerShell 1.0 и 2.0, но в нем будут отражены ТОЛЬКО стандартные выходные данные и ошибки в PowerShell 3.0 и более поздних версиях.

6 голосов
/ 28 июня 2017

Я не был удовлетворен ни одним ответом, который нашел, поэтому я смешал несколько и придумал следующее (в 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
1 голос
/ 23 апреля 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...