【问题标题】:can't get the foreach output to a file in powershell无法将 foreach 输出到 powershell 中的文件
【发布时间】:2019-10-16 08:13:37
【问题描述】:

我是 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

【问题讨论】:

  • 你能修改get_alerts函数吗?
  • 如果您在get_alerts 函数中没有指定特定的返回值,则不会有任何可保存的内容。更新该函数以返回警报( s) 调用脚本
  • 如果您将foreach 输出存储到$output,为什么还要在foreach 之后将其通过管道传输到$output?您应该从第二行中删除|,否则帖子中的代码中还缺少其他内容。
  • 顺便说一句:在 PowerShell 中,函数的调用类似于 shell 命令 - get_alerts $element $arg2 - 像 C# 方法 - get_alerts($element, $arg2);见Get-Help about_Parsing。为防止意外使用方法语法,请使用Set-StrictMode -Version 2 或更高版本,但请注意其其他影响。

标签: powershell


【解决方案1】:

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

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

【讨论】:

  • 它会输出 $element 值,而不是找到的警报
【解决方案2】:

您声明您的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的最后一段

【讨论】:

    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多