2011-07-29 9 views
2

私が書いている.ps1スクリプト内で使用されるPowershell関数を書いています。値を返してデバッグ出力を生成するPowershell関数

この関数は、スクリプト内で関数を呼び出す関数で使用される単一の数値を返します。開発中に、デバッグ情報(普通の古い文字列)を出力する機能が欲しいです。

時々私はちょうど私が私が

.\myscript.pl1 > file.txt 

または

のいずれかでやると仮定している(時々私はそれをファイルにキャプチャしたいのですが、デバッグ出力を画面に表示したいです?

これを行うにはどのような方法があります

.\myscript.pl1 2> file.txt 


マイクは、私は、ログ書き込み試してみたいが、私のシステム上で私が持っている:

 
D:\library>gcm write* 

CommandType  Name 
-----------  ---- 
Alias   write 
Application  write.exe 
Application  write.exe 
Cmdlet   Write-Debug 
Cmdlet   Write-Error 
Cmdlet   Write-EventLog 
Cmdlet   Write-Host 
Cmdlet   Write-Output 
Cmdlet   Write-Progress 
Cmdlet   Write-Verbose 
Cmdlet   Write-Warning 
+0

もっと考えてみると、私は沈んだと思うよ。私はSTDOUTと戻り値に書き込むことができる関数に慣れていますが、これらの2つの点は異なります。彼らはPowershellで常に同じですか? – JonathanZ

+1

もちろんです。 'Write-Output'と' Write-Host'を比較してください。 'Write-Debug'、' Write-Warning'、 'Write-Error'、' Write-Verbose'もあります。 PowerShellにはたくさんのストリームがあり、 'Write-Output'だけがパイプラインに行きます。 – Joey

+0

Joey-これらはデフォルトで画面に表示され、ファイルにリダイレクトできますか? – JonathanZ

答えて

0

Tee-Objectはあなたの友人です。私はあなたにこの時間を理解していれば

Testing 
20 
+0

文字列を書くために関数内に何を入れますか?私は書き込みホストと書き込み出力を試みました。最初の関数はリダイレクトされず、2番目の関数は関数によって呼び出し関数に返されます。 – JonathanZ

+0

答えを更新しました。それがあなたのために働くかどうか見てください! – ravikanth

+0

私の質問では、DisplayはCallAnotherに値を返す必要があります。私はあなたの例でそれを見ません。 – JonathanZ

1

Function display { 
    Write-Output "Testing" 
    return 20 
} 

Function CallAnother { 
    Display 
}  

CallAnother | Tee-Object "C:\DropBox\Scripts\Test.log" 

そして、この出力を私のコンソールでとtest.log:ここ

get-process | tee-object -filepath C:\Test1\testfile2.txt 

は、私は私のスクリプトでティーを使用する方法ですあなたは次のようなことができます:

start-transcript -path debug.txt 
write-debug "blah" 
stop-transcript 

あなたは、出力のいずれかの種類をしたくないときに出力したくないときので、$debugpreference="SilentlyContinue"

を残し、Continue

に設定唯一のことは、ファイルが転写産物のための余分なノイズを持っているということです。私のスクリプトで

0

は、私はそれは、入力がアウトファイルを使用して、必要に応じて書き込みホストで画面に書き込みますです書き込み書き込みログ機能を使用します。

書き込みログ-Message $ MyMessage -Path $ MyLogを - WriteHost

このアプローチでは、Start-Transcriptのようにstderrに書き込まれたメッセージは取得されませんが、ログに書き込まれる内容は制御できます。私はしばしばデバッグ時に両方のテクニックを組み合わせます。

+0

オリジナルの質問に長いコメントが追加されました^^^^ – JonathanZ

+0

私はこれを見つけました:http://poshcode.org/2566。私はそれがあなたが使っているものだと推測しています。 – JonathanZ

1

は、この試してみて、それが書き込みデバッグコンソールに書き込みますであるため、それは


Set-Variable -Name DebugPreference -Value 'Continue' 
$outFile = 'C:\tmp\debug.out' 

function calledFunction { 
    if ($outFile) { 
     "`nIn Called Function" | Out-File $outFile -Append 
     Write-Debug "In called function IF" 
     return 1 
    } 
    else { 
    Write-Debug "In called function ELSE" 
    return 900 
    } 
} 

function callingFunction { 
    $returnCount = calledFunction 
    if ($outFile) { "`nReturn Count is $returnCount" | Out-File $outFile -Append } 
    Write-Debug "Return Count is $returnCount" 
    $outFile = $null 
    if ((calledFunction) -gt 10) { Write-Debug "outFile is not set" } 
} 

callingFunction 

に役立つかどうかを確認します。これらのメッセージを表示したくない場合は、最初の行のDebugPreferenceの値を 'SilentlyContinue'に変更します。

出力をdebug.outファイルに出力したくない場合は、その行をコメントアウトするか、$ outFile = $ nullに設定します。

関連する問題