在PowerShell中使用Get-ChildItem的Handeling非停止错误

时间:2016-12-23 06:49:34

标签: powershell exception-handling

我目前正在编写一个脚本,该脚本应该用于获取CIFS共享上目录树的平均访问/列表时间。为此,我使用以下代码(作为代码段):

$time = Measure-Command {
    try{
        $subitems = Get-ChildItem $directory
    }catch{
        $msg = "Error accessing "+$dir+": "+$_.Exception.Message
    }
}

这段代码工作正常并且确实为我提供了我想要的信息。但是我面临的一个问题是Get-ChildItem存在非停止错误,这些错误没有被捕获(因为它们没有停止)。为了防止这种情况,我可以将-ErrorAction Stop添加到Get-ChildItem,但如果我这样做,我就无法获得甚至有一个项目会引发错误的目录的列表。

此示例包括缺少权限和超过260个字符的路径(无论出于何种原因仍然存在)。我真的希望以某种方式获取这些信息,以便进一步处理/报告。有谁知道如何抓住那些/对那些做出反应?

到目前为止,我的研究总是建议使用-ErrorAcction Stop来放弃"丢弃"我可以使用$subitems的任何信息。

1 个答案:

答案 0 :(得分:1)

因此,您希望捕获错误并继续执行脚本,我已修改您的代码以重定向错误输出,然后检查上一个命令的退出状态以检查是否发生任何错误。

这是你在找什么?

$time = Measure-Command {
    try{
        $subitems = Get-ChildItem $directory 2> $outnull
        if(-not $?){

        #whatever action you want to perform
        $msg = $msg + "Error accessing "+$dir+": "+$error[0].Exception.Message
        }

    }catch{
        $msg = "Error accessing "+$dir+": "+$_.Exception.Message
    }
}

我在块中连接$ msg与自身连接,因此覆盖不会丢失msg