Powershell: IOException try / catch не работает - PullRequest
13 голосов
/ 23 июня 2010

У меня есть сценарий 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 ]

24 голосов
/ 23 июня 2010

Операторы 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
1 голос
/ 18 ноября 2016

Мне удалось решить эту проблему, добавив -ErrorAction Stop к команде Move-Item. Похоже, это заставляет его выдавать ошибку, как задумано, вместо того, чтобы делать все, что он хочет.

0 голосов
/ 06 сентября 2016

Что я обычно делаю в этих ситуациях, так это использую оператор Switch, он работает для большинства ошибок без прерывания.Примерно так:

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

Это просто просмотр исключения и выполнение чего-то определенного в блоке скрипта.

Больше можно найти в операторах Switch здесь или здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...