【问题标题】:How to redirect the output of a PowerShell to a file during its execution如何在执行期间将 PowerShell 的输出重定向到文件
【发布时间】:2009-07-31 22:49:09
【问题描述】:

我有一个 PowerShell 脚本,我想将其输出重定向到一个文件。问题是我无法更改调用此脚本的方式。所以我不能这样做:

 .\MyScript.ps1 > output.txt

如何在执行期间重定向 PowerShell 脚本的输出?

【问题讨论】:

  • 正如@Nathan 在他的回答中提到的,如果您使用的是 Powershell 3.0 或更高版本,那么这应该可以工作。检查这个:stackoverflow.com/a/2916392/3197387

标签: powershell scripting stdout


【解决方案1】:

也许Start-Transcript 对你有用。如果它已经在运行,首先停止它,然后启动它,完成后停止它。

$ErrorActionPreference="静默继续" 停止成绩单 |外空 $ErrorActionPreference = "继续" Start-Transcript -path C:\output.txt -append # 做一些事情 停止成绩单

您也可以在处理内容时运行它,并让它保存您的命令行会话以供以后参考。

如果您想在尝试停止未转录的成绩单时完全抑制错误,您可以这样做:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

【讨论】:

  • 请注意 start-transcript 不记录 Write-Error、Write-Verbose 或 Write-Debug...仅标准输出。
  • @richard:现在看来是这样。也许这是 2.0 的补充,不确定这些答案是否都适用于 1.0。
  • 我使用的代码几乎与上面相同。我的问题是,如果没有开始转录,Stop-Transcript |out-null 仍然会发送错误输出。我需要抑制消息,因为它弄乱了我的布局。 -erroraction quietlycontinue 也无济于事。有什么想法吗?
  • 最后,我找到了Start-Transcript 的文档。 (令人沮丧的是没有标有 Powershell 版本号)。它“脚本包括用户键入的所有命令和控制台上显示的所有输出”。但是,我在 Powershell 2.0 中测试了 Start-Transcript,发现 @Richard 是对的,标准错误 isn't 保存到脚本中。这太糟糕了!
  • 如果您确实有权写入指定位置,此方法似乎不会警告您。
【解决方案2】:

Microsoft 有 announced on Powershell's Connections web site (2012-02-15 at 4:40 PM) 在 3.0 版中他们扩展了重定向作为解决此问题的方法。

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

有关详细信息和示例,请参阅“about_Redirection”帮助文章。

help about_Redirection

【讨论】:

  • 并不是说我喜欢这个解决方案。事实上,我觉得它丑陋、难以记忆且不灵活。似乎将流捕获参数添加到 Out-*、Set-Content 和 Add-Content Cmdlet 会以更 Powershelly 的方式完成。当他们使用它时,他们还应该添加一个 -PassThru 参数。这将有效地使不太有用的 Tee-Object Cmdlet 过时。
  • 我很困惑,这如何回答所提出的问题? "如何在执行 PowerShell 脚本期间重定向输出?
  • 你说得对,@Zoredache,我似乎忽略了“无法更改调用此脚本的方式”的要求。当捕获大部分输出时,Start-Transcript 是要走的路。我应该删除这个答案吗?
  • 对于那些来这里进行一般重定向的人,Powershell 已经添加了 -OutVariable -WarningVariable -ErrorVariable ,它直接回答了我 14 年 1 月 3 日的评论。
  • 不,离开它很好。鉴于赞成票的数量,它显然是有用的。几乎可以肯定,这个问题正在从能够改变脚本调用方式的人那里获得 Google 的点击率。
【解决方案3】:

用途:

Write "Stuff to write" | Out-File Outputfile.txt -Append

【讨论】:

  • 不能解决 OP 的问题,因为它在“执行期间”不起作用。但我给它 +1 是因为知道如何在 Powershell 中进行管道传输很有用。
  • 这会截断长行输出并删除信息
【解决方案4】:

我认为你可以修改MyScript.ps1。然后尝试像这样更改它:

$(
    Here is your current script
) *>&1 > output.txt

我刚刚使用 PowerShell 3 进行了尝试。您可以使用 Nathan Hartley's answer 中的所有重定向选项。

【讨论】:

  • 我喜欢这个解决方案。您可以使用 >> output.txt 追加。任何人都知道是否有办法让这个创建 ascii 而不是 unicode?​​span>
  • 你可以试试这样:*>&1 | Out-File $log -Encoding ascii -Append -Width 132 但是如果你需要精确控制输出,Powershell 真的很丑。
  • 我更喜欢这个,因为它可以在您的脚本中使用。非常适合流浪者。
【解决方案5】:
powershell ".\MyScript.ps1" > test.log

【讨论】:

  • 这是对我的脚本输出有效的众多选项中的唯一
【解决方案6】:

如果您的情况允许,一种可能的解决方案:

  1. 将 MyScript.ps1 重命名为 TheRealMyScript.ps1
  2. 创建一个新的 MyScript.ps1,如下所示:

    .\TheRealMyScript.ps1 > output.txt

【讨论】:

    【解决方案7】:

    如果您想将所有输出直接重定向到文件,请尝试使用*>>

    # You'll receive standard output for the first command, and an error from the second command.
    mkdir c:\temp -force *>> c:\my.log ;
    mkdir c:\temp *>> c:\my.log ;
    

    由于这是直接重定向到文件,它不会输出到控制台(通常很有帮助)。如果您需要控制台输出,请将所有输出与*&>1 合并,然后使用Tee-Object 进行管道传输:

    mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
    mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;
    
    # Shorter aliased version
    mkdir c:\temp *>&1 | tee -Append c:\my.log ;
    

    我相信 PowerShell 3.0 或更高版本支持这些技术;我正在 PowerShell 5.0 上进行测试。

    【讨论】:

      【解决方案8】:

      您可能想查看 cmdlet Tee-Object。您可以将输出通过管道传输到 Tee,它将写入管道以及文件

      【讨论】:

      • "输出" |设置内容-PassThru 和“输出” | Add-Content -PassThru 也可以像 Tee-Object 一样工作,另外还有一个好处是您可以设置编码。
      【解决方案9】:

      如果您想从命令行执行此操作,而不是内置到脚本本身,请使用:

      .\myscript.ps1 | Out-File c:\output.csv
      

      【讨论】:

      • 提问者明确说明无法更改脚本调用。
      • 与问题无关,但对我有帮助,我正在谷歌搜索以使用 Pipe to Out-File 获得正确的语法。
      【解决方案10】:

      要将其嵌入到您的脚本中,您可以这样做:

              Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append
      

      这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 2022-01-24
        • 2021-07-21
        • 2015-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多