我正在尝试将执行脚本的整个输出(包括错误)同时写入控制台和文件。我尝试了几种不同的选择:
.\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
答案 0 :(得分:22)
你试过了吗?
.\MyScript.ps1 2>&1 | tee -filePath c:\results.txt
2>&1
正是您要找的
注意:此答案在PowerShell 1.0和2.0中运行良好,但在PowerShell 3.0及更高版本中仅捕获标准输出和错误。
答案 1 :(得分:6)
我对找到的任何答案都不满意,所以我混合了一些并想出了这个(在 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
答案 2 :(得分:1)
我无法在同一个文件中同时获得错误和结果。一个对我有用的解决方法:
.\MyScript.ps1 2> C:\errors.txt | tee -filePath C:\results.txt
更新:
我已经进一步工作了,我在我的模式中使用了Start-Transcript
和Stop-Transcript
来捕获所有内容并且它有效!
答案 3 :(得分:0)