我有一个传递文件的脚本,我想将任何错误重定向到变量并在脚本的末尾打印它们。
以下是我遇到的问题的示例:
Get-ChildItem C:\Windows\appcompat -Recurse | ForEach-Object {
# do stuff ...
}
有时会有一些我无法访问它们的文件夹,它会抛出异常:
我知道如何忽略这些错误并继续使用开关-ErrorAction
,但我想收集所有无法访问的文件夹并在脚本末尾打印它们。
使用redirection,可以使用2>
将错误重定向到文件:
Get-ChildItem C:\Windows\appcompat -Recurse 2> errors.txt | ForEach-Object {
# do stuff ...
}
是否可以将错误重定向到变量,然后我会在脚本的末尾打印它们?
答案 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]
类型的集合。
不幸的是,这种方便的错误收集机制在调用外部程序 时不可用(例如,当您致电git
时),因为这样的调用不支持通用参数;但是,有一个suggestion on GitHub to introduce an alternative syntax。