Подтвердить что ты не робот

Запись ошибок и вывод в текстовый файл и Консоль

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 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

Ответ 3

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

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

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