如何将错误重定向到变量

时间:2018-03-04 13:42:58

标签: powershell redirect

我有一个传递文件的脚本,我想将任何错误重定向到变量并在脚本的末尾打印它们。
以下是我遇到的问题的示例:

 Get-ChildItem C:\Windows\appcompat -Recurse | ForEach-Object {
            # do stuff ...
        }

有时会有一些我无法访问它们的文件夹,它会抛出异常:
enter image description here 我知道如何忽略这些错误并继续使用开关-ErrorAction,但我想收集所有无法访问的文件夹并在脚本末尾打印它们。

使用redirection,可以使用2>将错误重定向到文件:

 Get-ChildItem C:\Windows\appcompat -Recurse 2> errors.txt | ForEach-Object {
    # do stuff ...
}

是否可以将错误重定向到变量,然后我会在脚本的末尾打印它们?

1 个答案:

答案 0 :(得分:2)

您可以使用common -ErrorVariable parameter收集变量 中的cmdlet错误。

由于此收集发生另外发送到错误流的错误,正常情况下,如果您需要,您必须使用2>$null显式静默错误流输出收集沉默

因此,为了静默收集变量$errs中的错误,请使用以下内容:

# Shorter equivalent of `-ErrorVariable errs`: `-ev errs`
Get-ChildItem C:\Windows\appcompat -Recurse -ErrorVariable errs 2>$null | ForEach-Object {
            # do stuff ...
}

注意:

  • -ErrorVariable的简称别名为-ev

  • 确保为目标变量名称添加前缀$ - 您传递名称,而不是其值。< / p>

  • 请勿使用名称Errors,因为$Errors是自动(内置)变量,其中正在收集会话中发生的所有错误。

  • 目标变量接收包含[System.Collections.ArrayList]个实例的[System.Management.Automation.ErrorRecord]类型的集合。

    • 请注意,即使只发生单个错误,您也会获得一个集合,这可能会令人惊讶,因为PowerShell通常会解包单个元素集合; this GitHub issue中讨论了这种令人惊讶的行为。

不幸的是,这种方便的错误收集机制在调用外部程序 可用(例如,当您致电git时),因为这样的调用不支持通用参数;但是,有一个suggestion on GitHub to introduce an alternative syntax