Write-Host "Server1"
などのコマンドを含むスクリプトがあります。どうすればファイルにエクスポートできますか?
script > export.txt
で試してみたところ、うまくいきませんでした。
Write-Host
は、出力のみをコンソールにリダイレクトします。
Write-Output
を使用してファイルにリダイレクトできます(> export.txt
またはOut-File export.txt
へのパイプ)
スクリプトからのすべての出力を絶対にリダイレクトする必要がある極端な場合は、次のコマンドレットをご覧ください。
Start-Transcript
Get-Help Start-Transcript -full
PowerShellでは、script > export.txt
はscript | Out-File -path export.txt
の構文シュガーです。
Write-Hostはオブジェクトをホストに送信しますが、オブジェクトを返しません。つまり、Out-Fileコマンドレットにパイプされるオブジェクトはなく、export.txtファイルには何も書き込まれません。回避策(スクリプトを変更したくない場合)は、cmd
コンソールを開き、cmdコンソールリダイレクトを使用してPowerShell出力をリダイレクトします。
C:\> powershell .\script.ps1 > .\export.txt
もちろん、さまざまなアプローチの有用性は主にユースケースに基づいていますが、...
これを行う「正しい」方法は、もしあなたがスクリプトをコントロールできれば(そして、これは私が通常ショートカットを探していたとはいえ、私が通常することです)、"オーバーロード" Write-Host
、いわば、そしてあなたがWrite-Host
に送ったすべてをこの新しい関数に送ってください。
有効なPowerShell動詞を維持するために、私はWrite-Feedback
と呼びます。
function Write-Feedback()
{
param
(
[Parameter(Position=0,ValueFromPipeline=$true)]
[string]$msg,
[string]$BackgroundColor = "Yellow",
[string]$ForegroundColor = "Black"
)
Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
}
これで、Write-Host
と本質的に同じように動作する関数ができましたが、出力先を簡単に制御できます。ファイルに書き込む必要がある場合は、Write-Feedback
を編集して、すべての呼び出しで必要な処理を実行できるようにします。
パイプラインで何か他のことを行っているかどうかに応じて、行をWrite-Output
に変更するだけです...
...
Write-Output $msg;
残りのコマンドをパイピングしているのと同じファイルに出力を送信できますが、Write-Feedback
関数内で、Write-Hostも保持します。
function Write-Feedback()
{
param
(
[Parameter(Position=0,ValueFromPipeline=$true)]
[string]$msg,
[string]$BackgroundColor = "Yellow",
[string]$ForegroundColor = "Black"
)
Write-Host -BackgroundColor $BackgroundColor -ForegroundColor $ForegroundColor $msg;
$msg | Out-File "./export.txt" -Append; # <<< or add a param to location
}
または、Write-Feedback
コンテンツをファイルにパイプしたくない外れ値がいくつかある場合、特定の各Write-Feedback
呼び出しをどうするかを尋ねる新しいオプションのパラメーターを追加できます。 switch
オフ-およびファイルに送信、Write-Host
、Write-Output
など-デフォルトを通常の設定に変更し、明示的にswitch
ing off明示的に設定された新しいパラメータの.
など。PowerShellで出力するために、すべての通話を中央のクリアリングハウスにルーティングする方がはるかに簡単です。それから、あなたがdoあなたの心を変えるとき、それは巨大な検索ではなく、置き換える-そして元に戻す-タスクです。
ここでの唯一の痛みは、パイプラインで物事を送りたくないので、Write-Output
は出ているが、Write-Feedback
に書き込まれたファイルがあなたのものと同じであることを確認したかった場合だと思います'> export.txt
を毎回編集せずに、例のWrite-Feedback
で指定しました。それを行う簡単な方法があるかどうかはわかりません。
ただし、「パイプステップ」から既に1ステップ削除されているため、これはおそらく正当なユースケースではありません。
とにかく、一番下の行はWrite-Host
をオーバーロードし、1か所で編集することで何でもしたいことです。