Powershell: IOException try/catch nicht funktioniert
Ich habe ein PS-Skript, das startet alle 5 Minuten zu prüfen, neu gelöscht Ordner und verschieben Sie Sie. Problem ist, dass manchmal Elemente innerhalb des Ordners sind noch nicht geschrieben, in welchem Fall das Skript gibt Fehler:
Move-Item : Der Prozess kann nicht auf die Datei zugreifen, da wird Sie von einem anderen Prozess verwendet. [Move-Item], IOException + FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Befehle.MoveItemCommand
Ich habe versucht, die folgenden try/catch-block, aber es immer noch Fehler auf der gleichen "Move-Item" - Linie. Irgendwelche Gedanken auf, was mache ich hier falsch?
try {
Move-Item -Force "$fileString" $fileStringFixed
}
catch [System.IO.IOException] {
return
}
Danke.
InformationsquelleAutor der Frage orbitron | 2010-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Try/catch-Anweisungen können nur fangen werden Fehler mit Abbruch (dieser zeigt normalerweise ein schwerer Fehler). PowerShell hat außerdem das Konzept der nicht-Fehler mit Abbruch. Die Datei-in-Gebrauch-Fehler, den Sie sehen, ist ein Fehler ohne Abbruch. Dies ist gut aus der Perspektive, dass, wenn Sie bewegt wurden Tausende von Dateien, und man hatte Ihr Ziel nicht in Gebrauch ist, wird der Befehl nicht Mist es geht. Hier haben Sie zwei Möglichkeiten. Sie können Sie ignorieren, diese Fehler durch die Einstellung der ErrorAction-parameter auf "SilentlyContinue" (Wert 0), z.B.:
Oder Sie können konvertieren Sie die nicht-Beendigung Fehler zu einem Fehler mit Abbruch durch diese Einstellung derselben parameter auf 'Stop' und dann mit try/catch zwar nicht filtern, von IOException, weil PowerShell-wraps Ausnahme z.B.:
InformationsquelleAutor der Antwort Keith Hill
Konnte ich dies lösen, indem hinzufügen
-ErrorAction Stop
zu denMove-Item
Befehl. Das scheint es zu zwingen, einen Fehler auslösen, wie vorgesehen, anstatt das zu tun, was es will.InformationsquelleAutor der Antwort Prank Monkey
Dem, was ich normalerweise tun, mit diesen Situationen ist die Verwendung einer Switch-Anweisung, funktioniert es für die meisten keine Fehler mit Abbruch. So etwas wie dieses;
Es sich nur auf das Ausnahme und etwas zu tun, definiert im Skript-block.
Mehr finden Sie auf Switch-Anweisungen hier oder hier
InformationsquelleAutor der Antwort Nigel Tatschner