无法将foreach输出获取到PowerShell中的文件

时间:2019-10-16 08:13:37

标签: powershell

我是Powershell的新手,我正在尝试将foreach循环的输出保存到文件中

foreach循环如下:

foreach ($element in $ashost)  {get_alerts($element)}

我正在收到标准输出中的警报列表

所以我试图通过以下方式将for循环输出写入文件:

$output =
foreach ($element in $ashost)  {get_alerts($element)}|
$output | Out-File "C:\File.txt"

但是文件创建为空

注意:“ get_alerts”是捕获每个警报的功能 我没有指定一个特定的返回值,它只是从屏幕上打印到屏幕上 函数内部的Write-Host

2 个答案:

答案 0 :(得分:0)

如果返回$element,则$output变量应包含请求的数据:

$output = foreach ($element in $ashost)  {get_alerts($element);$element;}|
$output | Out-File "C:\File.txt"

答案 1 :(得分:0)

您声明自己的get_alerts函数使用Write-Host打印到屏幕

Write-Host的设计输出不会发送到PowerShell的成功输出流 [1] ,因此 $output 中没有捕获任何内容,因此没有任何内容发送到Out-File,这就是为什么您最终得到一个空文件的原因。

  • 如果您可以修改get_alerts函数,请将Write-Host调用替换为Write-Output调用,或者仅使用隐式输出(例如,使用Write-Host $foo或简单地使用Write-Output $foo代替$foo

  • 如果不能,并且如果使用PowerShell v5或更高版本,则可以使用重定向6>&1Write-Host的输出重定向到成功输出流,可让您捕获它:

& { foreach ($elem in $ashost) { get_alerts $elem } } 6>&1 | Out-File C:\File.txt

或者,使用单个管道:

$ashost | ForEach-Object { get_alerts $_ } 6>&1 | Out-File C:\File.txt

有关更多信息,请参见this answer


[1] Write-Host is typically the wrong tool to use,除非目的是仅将写入显示内容,否则绕过成功输出流,并具有将输出发送到其他命令的能力,将其捕获到变量中,然后将其重定向到文件。在PSv5 +中,Write-Host写入information stream,可以捕获其输出 ,但只能通过6>。另请参阅:https://stackoverflow.com/a/50416448/45375

的最后一部分