Powershell:IOException try / catch无效

时间:2010-06-22 23:05:34

标签: powershell

我有一个PS脚本,每5分钟启动一次,检查新删除的文件夹并移动它们。问题是有时文件夹中的项目仍然被写入,在这种情况下脚本错误:

  

Move-Item:进程无法访问该文件,因为它正由另一个进程使用。 [Move-Item],IOException + FullyQualifiedErrorId:MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

我尝试了以下try / catch块,但它仍然在同一个“Move-Item”行上出错。对我在这里做错了什么的想法?

          try {
           Move-Item -Force "$fileString" $fileStringFixed
          }
          catch [System.IO.IOException] {
           return
          }

谢谢。

3 个答案:

答案 0 :(得分:24)

Try / catch语句只能捕获终止错误(这些通常表示严重错误)。 PowerShell还具有非终止错误的概念。您看到的文件使用中的错误是一个非终止错误。从这个角度来看,这是好的,如果你移动了数千个文件而且其中一个目标正在使用中,那么命令就不会让它继续下去。你有两个选择。您可以通过将ErrorAction参数设置为SilentlyContinue(值为0)来忽略这些错误,例如:

Move-Item foo bar -ea 0

或者您可以通过将此相同参数设置为“Stop”将非终止错误转换为终止错误,然后使用try / catch,但不要通过IOException进行过滤,因为PowerShell包装了异常,例如:

try { move-Item .\About_This_Site.txt vmmap.exe -ea stop } `
catch {$_.GetType().FullName}
System.Management.Automation.ErrorRecord

答案 1 :(得分:1)

我能够通过向-ErrorAction Stop命令添加Move-Item来解决这个问题。这似乎迫使它按预期抛出错误,而不是做任何想做的事。

答案 2 :(得分:0)

我通常对这些情况做的是使用Switch语句,它适用于大多数无终止错误。像这样的东西;

Switch -Regex ($_.exception) {
        "used by another process" {
            "Do Something about the error"
        }
    Default {
            "Default Action"
        }
}

它只是查看异常并执行脚本块中定义的操作。

可以在Switch语句herehere

上找到更多内容
相关问题