如何在PowerShell中将foreach循环的输出转储到文件中?

12

我编写了以下脚本来读取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 和重定向运算符将输出转储到文件中,但我没有找到任何解决方法。


4
移除 write-host 命令,改用管道输出到 out-file!(或者至少使用 Write-Output - CB.
@CB是正确的。Write-Host直接写入屏幕而不是输出流,因此使用write-host写入的任何内容都无法重定向到文件。 - Keith Hill
@CB,我按照你的建议操作了,但仍然遇到一些问题。write-output会在文件中打印额外的行,而我不想要。out-file选项出现以下错误,只是一个示例:Unexpected token ''$First';' in expression or statement. At C:\Users\Demo\Desktop\2parse.ps1:20 char:14 + "mc_output= "'$Second'; |out-file -filepath "C:\Users\Demo\Desktop\dump.txt ... - HamTheAstroChimp
当你说你不想要额外的行时,你指的是哪些额外的行?你想让所有文本在同一行上吗?如果是这样,那么似乎你正在尝试创建类似于 csv 文件的东西,并且可能可以看一下 Export-Csv 命令。 - Robert Westerlund
1个回答

30

Write-Host 写入控制台。除非在另一个进程中运行代码,否则无法重定向该输出。要么完全删除 Write-Host,要么将其替换为 Write-Output,以便将消息写入“成功”输出流。

使用 foreach 循环还需要额外的措施,因为该循环类型不支持管道传输。可以将其运行在子表达式中:

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

或将其输出赋值给一个变量:

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

另一个选项是使用支持管道的ForEach-Object循环替换foreach循环:

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

不要在循环内使用 Out-File,因为多次打开文件会导致性能下降。


1
我还建议删除所有反引号,并将双引号移动到行末。例如:"my_object='$First';" - TheMadTechnician
@TheMadTechnician 一个here string将是更好的选择。 - Ansgar Wiechers
@AnsgarWiechers,我使用了你的带管道选项的 ForEach-Object。它真的非常好用 :) - HamTheAstroChimp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接