Запись ошибок и вывод в текстовый файл и Консоль
Я пытаюсь записать весь вывод (включая ошибки) исполняемого 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
Ответы
Ответ 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
в своем режиме, чтобы захватить все, и это сработало!