chkdsk
Goto Top

PS: copy-item - warten bis Kopiervorgang fertig

Moin Moin Zusammen,

ich habe eine kurze Frage zum Kopiervorgang in Powershell. Meiner Meinung nach hat Powershell keinen "Blocker" im Kopiervorgang, d.h. eine Überprüfung ob der Vorgang fertig ist.
Hintergund: ich möchte, das mein Skript erst dann weiter macht, wenn der Kopiervorgang abgeschlossen ist. Bisher habe ich das immer über bspw. start-sleep -s 5 gemacht, was aber nicht immer zuverlässig läuft. Je nach Netzwerkverbindung beim Kopiervorgang von Server -> Client kannes auch mal länger als 5 Sekunden dauern.

Content-Key: 623036

Url: https://administrator.de/contentid/623036

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: Chaos0815
Chaos0815 17.11.2020 um 14:10:11 Uhr
Goto Top
Ich habe das bei mir mal eben nachgestellt, mein Skript wartet von selbst bis das Copy-Item Befehl abgeschlossen ist.
Wie rufst du das denn auf? Geplante Aufgabe oder interaktiv über eine .ps1 Datei?
Mitglied: Printe
Printe 17.11.2020 aktualisiert um 14:46:04 Uhr
Goto Top
Meiner Meinung nach hat Powershell keinen "Blocker" im Kopiervorgang, d.h. eine Überprüfung ob der Vorgang fertig ist.
Doch das tut es, es blockiert per Default die Shell so lange bis der Vorgang abgeschlossen ist. Intern verwendet die PS ja Win32 Funktionen wie diese hier https://docs.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shob ... und diese warten Standardmäßig auf den Abschluss und bevor sie ein Return Value zurückgeben, es ist also keine Async-Operation
Pointer to a new name for the item after it has been copied.
Die Aufhebung des Write-Handle's kann jedoch je nach OS und welche Prozesse da ihren Finger drauf haben u. U. verzögert released werden. Da lässt sich aber mit einem OpenWrite() schnell in einer Schleife in einem Try-Catch Konstrukt überprüfen wenn man das File direkt weiterverarbeiten will.
while($true){
    $fs =  $null
    try{
        $fs = (New-Object System.IO.FileInfo "D:\Path\To\a\file.txt").OpenWrite()  
        break
    }catch{
    }finally{
        if($fs){$fs.Close(); $fs.Dispose()}
    }
    sleep -Seconds 1
}