web-dev-qa-db-ja.com

foreachループの出力をPowerShellのファイルにダンプする方法は?

次のスクリプトを作成して、CSVファイルを読み取り、出力のカスタム形式を実行しました。

スクリプトは以下の通りです:

$Content = Import-Csv Alert.csv
foreach ($Data in $Content) {
    $First = $Data.DisplayName
    $Second = $Data.ComputerName
    $Third = $Data.Description
    $Four = $Data.Name
    $Five = $Data.ModifiedBy
    $Six = $Data.State
    $Seven = $Data.Sev
    $Eight = $Data.Id
    $Nine = $Data.Time

    Write-Host "START;"
    Write-Host "my_object="`'$First`'`;
    Write-Host "my_Host="`'$Second`'`;
    Write-Host "my_long_msg="`'$Third`'`;
    Write-Host "my_tool_id="`'$Four`'`;
    Write-Host "my_owner="`'$Five`'`;
    Write-Host "my_parameter="`'$Four`'`;
    Write-Host "my_parameter_value="`'$Six`'`;
    Write-Host "my_tool_sev="`'$Seven`'`;
    Write-Host "my_tool_key="`'$Eight`'`;
    Write-Host "msg="`'$Four`'`;
    Write-Host "END"
}

上記のスクリプトはエラーなしで実行されます。

PowerShellでOut-Fileおよびリダイレクト演算子を使用して出力をファイルにダンプしようとしましたが、解決策が見つかりません。

5

Write-Hostはコンソールに書き込みます。別のプロセスでコードを実行しない限り、その出力はリダイレクトできません。 Write-Hostを完全に削除するか、Write-Outputに置き換えて、メッセージが成功出力ストリームに書き込まれるようにします。

foreachループを使用するには、ループの種類がパイプライン処理をサポートしていないため、追加の対策も必要です。部分式で実行します。

(foreach ($Data in $Content) { ... }) | Out-File ...

または、その出力を変数に割り当てます。

$output = foreach ($Data in $Content) { ... }
$output | Out-File ...

もう1つのオプションは、foreachループをForEach-Objectループに置き換えることです。これにより、パイプライン処理がサポートされます。

$Content | ForEach-Object {
  $First = $_.DisplayName
  $Second = $_.ComputerName
  ...
} | Out-File ...

ループ内でOut-Fileを使用しないでください。繰り返しファイルを開くと、パフォーマンスが低下します。

19
Ansgar Wiechers