如何将错误重定向到变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将错误重定向到变量相关的知识,希望对你有一定的参考价值。

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

 Get-ChildItem C:Windowsappcompat -Recurse | ForEach-Object {
            # do stuff ...
        }

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

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

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

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

答案

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

由于除了将错误发送到错误流之外发生此收集,如通常一样,如果您希望收集是静默的,则必须使用2>$null显式地使错误流输出静音。

因此,为了在变量$errs中静默收集错误,请使用以下命令:

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

注意:

  • -ErrorVariable的短名称是-ev
  • 请确保不要使用$为目标变量名添加前缀 - 您要传递其名称,而不是其值。
  • 不要使用名称Errors,因为$Errors是自动(内置)变量,其中正在收集会话中发生的所有错误。
  • 目标变量接收包含[System.Collections.ArrayList]实例的[System.Management.Automation.ErrorRecord]类型的集合。 请注意,即使只发生了一个错误,您也可以获得一个集合,这可能会令人惊讶,因为PowerShell通常会解包单个元素集合;这种令人惊讶的行为在this GitHub issue中讨论过。

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

以上是关于如何将错误重定向到变量的主要内容,如果未能解决你的问题,请参考以下文章

Linkedin OAuth 2.0 重定向 URL 不能包含片段标识符 (#)

如何将输出重定向到 shell 中的变量? [复制]

管道符重定向与环境变量

如何使用 .htaccess 将错误 404 重定向到主页?

PHP header()使用POST变量重定向[重复]

Linux 第三天 重定负管道符环境变量