Benutzer mit den meisten Antworten
copy-item und bestehende Verzeichnisse im Ziel ohne Eingabe übergehen, nicht überschreiben

Frage
-
Hallo,
ich möchte Dateien und Verzeichnisse des Öfteren von a nach b kopieren. Dabei kommt es vor, das schon vorhandene Verzeichnisse mit gleichem Inhalt bei weiteren Kopieraktionen einen Abbruch erzeugen, sofern ich nicht den Parameter -Force zum Überschreiben nutze. Ich möchte die Dateien aber nicht überschreiben, da dies den Kopiervorgang erheblich verlängert.
Ich habe keinen Parameter gefunden, der dies ermöglicht. Spielen mit "-container" und "-WarningAction silentlycontinue" brachte auch keinen Erfolg.
Übersehe ich da nur etwas, oder muss ich die Sache anders angehen?
Habe es auch mit einer Filterung nach dem Archivbit "Normal" versucht, da die zu kopierenden Dateien dieses Bit haben, und die Dateien im Zielverzeichnis das Bit "Archiv". Hat bei mir allerdings auch nicht funktioniert.
Wie immer bin ich für jede Hilfe dankbar!Sönke
Hier der Punkt, um den es geht:
Copy-Item -Path $Quelle -Destination $H320 -container -force -recurse -ErrorAction Stop
Hier das ganze Script, welches im Try, Catch Modus läuft:
############################################################################################################################ # Abfrage Laufwerksbuchstaben aller USB Devices, die "TOSHIBA MK3006GAL USB Device" heißen und speichern in einer Variable # ############################################################################################################################ $H320Test = gwmi win32_diskdrive | ?{$_.caption -eq "TOSHIBA MK3006GAL USB Device"} | %{gwmi -Query "ASSOCIATORS OF {Win32_DiskDrive.DeviceID=`"$($_.DeviceID.replace('\','\\'))`"} WHERE AssocClass = Win32_DiskDriveToDiskPartition"} | %{gwmi -Query "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=`"$($_.DeviceID)`"} WHERE AssocClass = Win32_LogicalDiskToPartition"} | %{$_.deviceid} #################### # Variablen setzen # #################### $Quelle = "W:\Hörspiele Temp\PlayerKopieren\*" $Temp = "W:\Hörspiele Temp\MediaKopieren\" $Temp2 = "W:\Hörspiele Temp\MediaKopieren\*" $Media = "\\MEDIA\Multimedia\Audio\Hoerspiele\Sortieren\" $MovedFilesMedia = "C:\temp\Logs\MP3Player\MovedFilesMedia.txt" $MovedFilesMp3 = "C:\temp\Logs\MP3Player\MovedFilesMp3.txt" $ScriptErrorsMedia = "C:\temp\Logs\MP3Player\ScriptErrorsMedia.txt" $ScriptErrorsMp3 = "C:\temp\Logs\MP3Player\ScriptErrorsMp3.txt" ##################################################################################### # Setzt Laufwerksbuchstaben des USB MP3 Players und Pfad zu Hörspielen zusammen. # # Falls nicht vorhanden, Exit! # ##################################################################################### Try { $H320 = "$H320Test\Music\Hörspiele" gci $H320 -ErrorAction stop } catch {$time = get-date -format f Add-Content $ScriptErrorsMp3("Fehler! Vermutlich MP3 Player nicht angeschlossen, daher Pfad falsch: "+$_.exception.message,$time) cscript.exe "C:\Program Files\Scripte\Andere Scripte\MP3Player\KopierenH320Fehler.vbs" exit} ##################################################################################### # Versucht Hörspiele auf MP3 Player zu kopieren. Logfiles werden für erfolgreichen # # oder fehlerhaften Vorgang angelegt. Falls Vorgang scheitert, Exit! # ##################################################################################### try { Copy-Item -Path $Quelle -Destination $H320 -container -force -recurse -ErrorAction Stop Get-ChildItem -Recurse $Quelle | ForEach-Object { $FilePath = $_.fullname, $_.Lastaccesstime $filepath | Out-file -Append $MovedFilesMp3} move-Item -Path $Quelle -Destination $Temp -ErrorAction Stop cscript.exe "C:\Program Files\Scripte\Andere Scripte\MP3Player\KopierenH320Fertig.vbs" } catch { $time = get-date -format f Add-Content $ScriptErrorsMp3("Fehler aufgetreten: "+$_.exception.message, $time) cscript.exe "C:\Program Files\Scripte\Andere Scripte\MP3Player\KopierenH320Fehler.vbs" exit} ##################################################################################### # Versucht Hörspiele auf NAS zu kopieren. Logfiles werden für erfolgreichen # # oder fehlerhaften Vorgang angelegt. Falls Vorgang scheitert, Exit! # ##################################################################################### try { Copy-Item -Path $Temp2 -Destination $Media -container -force -recurse -ErrorAction Stop Get-ChildItem -Recurse $temp2 | ForEach-Object { $FilePath2 = $_.fullname, $_.Lastaccesstime $filepath2 | Out-file -Append $MovedFilesMedia} remove-Item -Path $temp2 -recurse -force -ErrorAction Stop cscript.exe "C:\Program Files\Scripte\Andere Scripte\MP3Player\VerschiebeMediaFertig.vbs" } catch { $time = get-date -format f Add-Content $ScriptErrorsMedia ("Fehler aufgetreten: "+$_.exception.message, $time) cscript.exe "C:\Program Files\Scripte\Andere Scripte\MP3Player\VerschiebeMediaFehler.vbs" }
Antworten
-
Hallo Sönke,
ich benutze für solche Kopieraktionen robocopy. Der überschreibt soweit ich weiß standardmäßig die Dateien nicht. Einfach mal robocopy /? ausführen und nachkucken.
Du kannst es problemlos aus Powershell aufrufen und z.B. die Returncodes auswerten.
VG
Bernd
PS: Für die Prüfung ob ein Laufwerk oder ein Pfad vorhanden ist würde ich das Cmdlet Test-Path benutzen.
- Als Antwort markiert Sönke T Montag, 4. Februar 2013 14:08
Alle Antworten
-
Hallo Sönke,
ich benutze für solche Kopieraktionen robocopy. Der überschreibt soweit ich weiß standardmäßig die Dateien nicht. Einfach mal robocopy /? ausführen und nachkucken.
Du kannst es problemlos aus Powershell aufrufen und z.B. die Returncodes auswerten.
VG
Bernd
PS: Für die Prüfung ob ein Laufwerk oder ein Pfad vorhanden ist würde ich das Cmdlet Test-Path benutzen.
- Als Antwort markiert Sönke T Montag, 4. Februar 2013 14:08
-
Danke für die Antwort!
Robocopy $Quelle $H320 /M /S /COPY:DAT /R:3
funktioniert und ersetzt nun
Copy-Item -Path $Quelle -Destination $H320 -container -force -recurse -ErrorAction Stop
Mit Robocopy kann ich allerdings kein -Erroraction Stop mehr anwenden, die erste Try, Catch Anweisung funktioniert also nicht mehr. Kann ich das mit Powershell Bordmitteln noch mit einbauen, oder muss ich die Try, Catch Anweisung dann entfernen? Dann wiederum würde ich kein Fenster bei erfolgreichem Ausführen bekommen und das Script würde im Fehlerfall auch nicht zum Fenster für einen Fehler springen.
Zum Testpath: Das mache ich so umständlich, da es sich um ein USB Laufwerk handelt, wobei der Laufwerksbuchstabe variiert. Mit Testpath müsste ich ja meines Wissens immer wissen, welchen Laufwerksbuchstaben ich anspreche.
- Bearbeitet Sönke T Montag, 4. Februar 2013 14:09 Textfehler