3

私は bash スクリプトのロギングを Powershell に移植しています。これには、ファイルの先頭に次の記述があります。

# redirect stderr and stdout
backupdir="/backup"
logfile=$backupdir/"std.log"
exec >  >(tee -a $logfile)
exec 2> >(tee -a $logfile >&2)
echo "directory listing:"
ls -la

exec ステートメントを使用すると、stdout と stderror の両方がログ ファイルにリダイレクトされます。

スクリプトの開始時にリダイレクトが一度設定されるため、bash の exec コマンドは非常に便利です。可能であれば、各コマンドでリダイレクトを明示的に設定することは避けたいです。

PowerShell に上記に相当するものはありますか?

4

2 に答える 2

1

PowerShell 2、3、x には、PowerShell ウィンドウのすべての出力をテキスト ファイルに記録しようとするTranscript コマンドレットがあります。いくつかの制限があります。

  • 外部実行可能 stdout、stderr はキャプチャされません

これを示すコード例を次に示します。

$this_path = Split-Path -Path $MyInvocation.MyCommand.Path -Parent
$log_path = Join-Path -Path $this_path -ChildPath script_log.txt
Start-Transcript -Path $log_path
$VerbosePreference = "continue"
$ErrorActionPreference = "continue"
$DebugPreference = "continue"
$WarningPreference = "continue"
& hostname.exe
Write-Host "write-host"
Write-Verbose "write-verbose"
Write-Error "write-error"
Write-Debug "write-debug"
Write-Warning "write-warning"
Get-Date
Stop-Transcript
& notepad $log_path

hostname.exe外部実行可能ファイルであるため、出力を除いて、上記のすべてが script_log.txt にキャプチャされます。

いくつかの回避策があります。

powershell.exe -noprofile -file script.ps1 > script.log

これは の出力を含むすべてをキャプチャしますhostname.exeが、スクリプトの外部で行われるものです。

もう 1 つは各外部コマンド用で、ホスト API を介して出力をパイプします。

& hostname.exe | Out-Default

これはスクリプトで行われますが、シェル ウィンドウの exe からテキストの色が失われます。

于 2013-04-13T19:26:52.943 に答える
0

スクリプト全体の出力ストリームを選択的にリダイレクトする必要がある場合は、バックグラウンド ジョブとして実行します。子ジョブは、ジョブ オブジェクトから読み取ることができる個別のバッファにそれぞれのジョブ ストリームを保持するため、ジョブの実行中にそれらを読み取るなど、必要なことはほとんど実行できます。

于 2013-04-15T01:22:57.993 に答える