我是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
答案 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>&1
将Write-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