Powershell: IOException try / catch ne fonctionne pas
J'ai une PS script qui lance toutes les 5 minutes pour vérifier récemment abandonné les dossiers et de les déplacer. Le problème est que, parfois, les éléments du dossier sont encore en cours d'écriture, dans lequel cas, les erreurs de script avec:
Déplacez-Élément : Le processus ne peut pas accéder au fichier car ce fichier est utilisé par un autre processus. [Move-Item], IOException + FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commandes.MoveItemCommand
J'ai essayé les bloc try/catch, mais il reste des erreurs sur la même "Déplacer le Point a" de la ligne. Toutes les pensées de ce que je fais mal?
try {
Move-Item -Force "$fileString" $fileStringFixed
}
catch [System.IO.IOException] {
return
}
Merci.
source d'informationauteur orbitron
Vous devez vous connecter pour publier un commentaire.
Les instructions Try/catch ne peut attraper la résiliation des erreurs (il s'agit généralement d'indiquer une erreur grave). PowerShell a aussi le concept de non-terminaison des erreurs. Le fichier-dans-l'utilisation d'erreur que vous voyez est un non-terminaison d'erreur. C'est bon du point de vue que si vous étiez en déplacement de milliers de fichiers, et l'un avait sa cible en cours d'utilisation, la commande n'est pas de la merde il continue à aller. Vous avez deux choix ici. Vous pouvez ignorer ces erreurs par la définition du paramètre ErrorAction à SilentlyContinue (valeur 0), par exemple:
Ou vous pouvez convertir la non-terminaison de l'erreur à une résiliation d'erreur en définissant ce même paramètre "Stop", puis utiliser le try/catch bien que ne pas filtrer par IOException parce que PowerShell enveloppements à l'exception par exemple:
J'ai été en mesure de résoudre ce problème en ajoutant
-ErrorAction Stop
à laMove-Item
de commande. Qui semble pour le forcer à lever une erreur comme prévu, au lieu de faire ce qu'il veut.Ce que je fais habituellement avec ces situations, c'est l'utilisation d'une instruction Switch, il fonctionne pour la plupart aucune résiliation des erreurs. Quelque chose comme ceci;
C'est juste en regardant l'exception et faire quelque chose de défini dans le bloc de script.
Plus peut être trouvé sur les instructions Switch ici ou ici