gpt4 book ai didi

PowerShell Tee-Object 不捕获文件中的调试行

转载 作者:行者123 更新时间:2023-12-04 02:28:07 25 4
gpt4 key购买 nike

我有一个通过自动化运行的 PowerShell 脚本,所以我需要将脚本的输出捕获到一个文件中,但我也想捕获运行的命令,为输出提供一些上下文(我' d 在 Linux shell 脚本中使用 set -x)。不过,我不知道如何将这些命令捕获到 Windows 的输出文件中;非常感谢任何帮助!

# script.ps1

Set-PSDebug -Trace 1
Write-Host "Hello, World!"

我如何调用脚本(从 cmd):

$ powershell -command "./script.ps1 *>&1 | Tee-Object -FilePath ./output.txt"

终端输出:

DEBUG:    2+  >>>> Write-Host "Hello, World!"
Hello, World!

output.txt 文件内容:

Hello, World!

您可以看到输出文件缺少终端中显示的调试行。 理想情况下,我希望调试行只出现在输出文件中(而不是终端输出),但在两个地方都有调试行也很好。

请注意,PowerShell 5.1 是我安装的版本。

最佳答案

不幸的是,PowerShell 的跟踪输出(通过 Set-PSDebug 激活)在 PowerShell's system of output streams 之外运行,因此此类输出无法从内部 PowerShell session 捕获。[1]

但是,PowerShell's CLI外部 调用者| [2],例如您的情况下的 cmd.exe确实通过 stdout(标准输出流)接收跟踪输出[3],因此您可以使用 cmd.exe 的重定向来捕获文件中的所有内容,然后将其打印到控制台。

一个简化的例子(来自 cmd.exe):

C:\>powershell -c "Set-PSDebug -Trace 1; Write-Host 'Hello, World!'" > output.txt & type output.txt

DEBUG: 1+ Set-PSDebug -Trace 1; >>>> Write-Host 'Hello, World!'
Hello, World!

[1] 也许令人惊讶的是,尽管 cmdlet 名称中包含“Debug”一词,但跟踪输出通过流编号 5,调试流,Write-Debug 的方式输出确实如此。

[2] 请注意,您也可以从现有的 PowerShell session 内部使用这种调用 CLI 的技术,总是作为一个子进程,在这种情况下,现有的 session 会执行作为外部来电者。但是,请注意,通过 script block 传递要执行的命令({ ... }) 通常更可取,但在这种情况下不起作用,因为基于脚本 block 的调用在幕后使用 PowerShell 的远程处理基础设施,这保留特定于 PowerShell 的输出流(以及类型保真度,但有限制),以便跟踪输出再次直接进入控制台。

[3] 也许令人惊讶的是,所有 PowerShell 的输出流 - 以及仅用于控制台的输出(例如通过跟踪生成的输出)默认映射到外部调用者的 stdout 流 - 包括错误。虽然您至少可以通过 stderr 重定向(2>)在调用方按需分离出错误,但所有剩余的流总是会被发送到标准输出 - 请参阅 this answer 的底部部分和 GitHub issue #7989了解更多信息。

关于PowerShell Tee-Object 不捕获文件中的调试行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65943627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com