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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 623036
Url: https://administrator.de/contentid/623036
Ausgedruckt am: 24.11.2024 um 08:11 Uhr
2 Kommentare
Neuester Kommentar
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-OperationPointer 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
}