我有一个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
}
谢谢。
答案 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)