Powershell - "Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird"

8

Unten ist ein Skript, das ein Verzeichnis und seine Unterordner (ausgenommen 1) für hinterlegte Dateien überwacht. Alle 10 Minuten suche ich nach neuen Dateien und vergleiche sie dann mit einer Datenbanktabelle, die mir sagt, wohin sie verschoben werden müssen. Es kopiert dann die Datei (en) lokal in ein Archiv, verschiebt es an den Ort, an den es verschoben werden soll, und fügt einen Datensatz in eine andere DB-Tabelle mit den Attributen der Datei ein und wohin sie kommt und geht. Wenn es in der Datenbank keine Übereinstimmung gibt oder ein Skriptfehler vorliegt, sendet er mir eine E-Mail.

Da Dateien jedoch ständig im Verzeichnis abgelegt werden, ist es möglich, dass eine Datei noch geschrieben wird, wenn das Skript ausgeführt wird. Als Ergebnis bekomme ich "Der Prozess kann nicht auf die Datei zugreifen, weil sie von einem anderen Prozess verwendet wird." hat mir die ganze Zeit per E-Mail geschickt. Außerdem, weil ich nicht mit dem Fehler im Vorfeld zu tun habe; Es geht durch die Schleife und ein falscher Eintrag wird in meine Protokolltabelle in der Datenbank mit falschen Dateiattributen eingefügt. Wenn die Datei schließlich freigegeben wird, wird sie erneut eingefügt.

Ich suche nach einer Möglichkeit, Dateien zu identifizieren, an die Prozesse angehängt sind. und überspringe sie, wenn das Skript ausgeführt wird - aber mehrere Tage der Websuche und einiger Tests haben noch keine Antwort geliefert.

Vielen Dank im Voraus.

%Vor%     
chrisnre 08.02.2012, 21:00
quelle

3 Antworten

3

Alternativ können Sie entweder über try / catch nach Fehlern suchen oder nach dem Move-Item-Versuch die $ error-Auflistung betrachten und dann die Bedingung entsprechend behandeln.

%Vor%     
xcud 08.02.2012 22:35
quelle
2

Sie können SysInternals handles.exe verwenden, um die geöffneten Handles für eine Datei zu finden. Die exe kann von Ссылка heruntergeladen werden.

%Vor%

Ausgaben:

%Vor%     
Arluin 18.03.2014 17:32
quelle
0

Eine Möglichkeit, Dateisperren zu vermeiden, die durch Ausführen des Skripts für einen Zeitgeber verursacht werden, ist die Verwendung eines ereignisgesteuerten Ansatzes mithilfe eines Dateisystembeobachters. Es kann Code ausführen, wenn ein Ereignis wie eine neue Datei in dem Ordner erstellt wird, den Sie überwachen.

Um Code auszuführen, wenn die Datei fertig kopiert wurde, müssen Sie auf das Ereignis changed warten. Bei diesem Ereignis tritt ein kleines Problem auf: Es wird einmal ausgelöst, wenn die Datei beginnt zu kopieren, und wenn sie beendet ist. Ich hatte eine Idee, dieses Problem mit Huhn / Ei zu umgehen, nachdem ich das Modul, mit dem Mike in den Kommentaren verlinkt war, ausprobiert hatte. Ich habe den folgenden Code so aktualisiert, dass er nur dann Code auslöst, wenn die Datei vollständig geschrieben wurde.

Um dies zu versuchen, ändern Sie $folderToMonitor in den Ordner, den Sie überwachen möchten, und fügen Sie Code hinzu, um die Datei zu verarbeiten.

%Vor%     
Andy Arismendi 08.02.2012 21:37
quelle

Tags und Links