2010-06-22 47 views
12

我有一个PS脚本每5分钟启动一次,以检查新丢弃的文件夹并移动它们。问题是,有时文件夹内的项目仍在写入,在这种情况下脚本错误与:Powershell:IOException尝试/ catch不起作用

Move-Item:进程无法访问文件,因为它正在被另一个进程使用。 [布展项目],IOException异常+ FullyQualifiedErrorId:MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

我已经试过以下try/catch块,但在相同的“移动项目”线仍然错误。我在这里做错了什么想法?

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

谢谢。

回答

23

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

Move-Item foo bar -ea 0 

或者您也可以通过此相同的参数设置为“停止”非终止错误转化为终止错误,然后使用的try/catch虽然不被IOException异常筛选因为PowerShell的包装异常如:

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

看起来就像它那样,非常感谢你! – orbitron 2010-06-22 23:48:00

+5

或全局设置为停止:$ ErrorActionPreference ='停止' – 2010-09-06 06:53:07

0

我最常做的这些情况是使用switch语句,它适用于大多数没有终止错误。像这样的东西;

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

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

更可以在switch语句herehere

1

我能够加入-ErrorAction StopMove-Item命令来解决这个问题被发现。这似乎迫使它按预期抛出一个错误,而不是做任何想要的事情。