web-dev-qa-db-ja.com

Write-Host =>ファイルにエクスポート

Write-Host "Server1"などのコマンドを含むスクリプトがあります。どうすればファイルにエクスポートできますか?

script > export.txtで試してみたところ、うまくいきませんでした。

14
expirat001

Write-Hostは、出力のみをコンソールにリダイレクトします。

Write-Outputを使用してファイルにリダイレクトできます(> export.txtまたはOut-File export.txtへのパイプ)

スクリプトからのすべての出力を絶対にリダイレクトする必要がある極端な場合は、次のコマンドレットをご覧ください。

Start-Transcript
Get-Help Start-Transcript -full
24
CB.

PowerShellでは、script > export.txtscript | Out-File -path export.txtの構文シュガーです。

Write-Hostはオブジェクトをホストに送信しますが、オブジェクトを返しません。つまり、Out-Fileコマンドレットにパイプされるオブジェクトはなく、export.txtファイルには何も書き込まれません。回避策(スクリプトを変更したくない場合)は、cmdコンソールを開き、cmdコンソールリダイレクトを使用してPowerShell出力をリダイレクトします。

C:\> powershell .\script.ps1 > .\export.txt
9
jon Z

もちろん、さまざまなアプローチの有用性は主にユースケースに基づいていますが、...

これを行う「正しい」方法は、もしあなたがスクリプトをコントロールできれば(そして、これは私が通常ショートカットを探していたとはいえ、私が通常することです)、"オーバーロード" 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-HostWrite-Outputなど-デフォルトを通常の設定に変更し、明示的にswitching off明示的に設定された新しいパラメータの.

など。PowerShellで出力するために、すべての通話を中央のクリアリングハウスにルーティングする方がはるかに簡単です。それから、あなたがdoあなたの心を変えるとき、それは巨大な検索ではなく、置き換える-そして元に戻す-タスクです。

ここでの唯一の痛みは、パイプラインで物事を送りたくないので、Write-Outputは出ているが、Write-Feedbackに書き込まれたファイルがあなたのものと同じであることを確認したかった場合だと思います'> export.txtを毎回編集せずに、例のWrite-Feedbackで指定しました。それを行う簡単な方法があるかどうかはわかりません。

ただし、「パイプステップ」から既に1ステップ削除されているため、これはおそらく正当なユースケースではありません。

とにかく、一番下の行はWrite-Hostをオーバーロードし、1か所で編集することで何でもしたいことです。

6
ruffin