【问题标题】:Powershell: IOException try/catch isn't workingPowershell:IOException try/catch 不起作用
【发布时间】:2020-06-15 00:43:43
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: powershell


    【解决方案1】:

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

    Move-Item foo bar -ErrorAction SilentlyContinue
    

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

    try { Move-Item .\About_This_Site.txt vmmap.exe -ErrorAction Stop } `
    catch {$_.GetType().FullName}
    System.Management.Automation.ErrorRecord
    

    【讨论】:

    • 或者全局设置为停止:$ErrorActionPreference = 'Stop'
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      更多信息请参见 Switch 语句 herehere

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多