次のスクリプトを作成して、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
およびリダイレクト演算子を使用して出力をファイルにダンプしようとしましたが、解決策が見つかりません。
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
を使用しないでください。繰り返しファイルを開くと、パフォーマンスが低下します。