web-dev-qa-db-ja.com

エラーと出力をテキストファイルとコンソールに書き込む

実行中のスクリプトの出力全体(エラーを含む)をコンソールとファイルに同時に書き込もうとしています。私はいくつかの異なるオプションを試しました:

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

私は、ファイルを使用して出力/エラーを確認できることを望みました。

編集:

これが私の現在のテストスクリプトです。望ましい結果は、3つすべてのメッセージを表示できることです。

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

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

やってみました:

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

2>&1はあなたが探しているものです

注:この回答は、PowerShell 1.0および2.0でうまく機能しますが、PowerShell 3.0以降では標準出力とエラーのみをキャプチャします。

22

私は見つけた答えに満足していなかったので、いくつかを混ぜてこれを思いつきました(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
6
jdgregson

同じファイルでエラーと結果の両方を取得できませんでした。私のために働いた回避策:

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

更新:さらに作業を進め、Start-TranscriptおよびStop-Transcript私のモードですべてをキャプチャし、それが機能しました!

1
user1096785

デフォルトでは、データの成功ストリームのみが出力ファイルに渡されます。エラーと警告を送信するには、次のようなものを追加する必要があります。

スクリプト3>&1 2>&1 | out-file log.txt

Powershell redirection operators.

0