none
copy-item und bestehende Verzeichnisse im Ziel ohne Eingabe übergehen, nicht überschreiben RRS feed

  • 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"
    }
    

    Samstag, 2. Februar 2013 17:55

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
    Sonntag, 3. Februar 2013 09:13

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
    Sonntag, 3. Februar 2013 09:13
  • 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
    Montag, 4. Februar 2013 13:40
  • Hallo Sönke,

    Du kannst beispielsweise mit gwmi win32_logicaldisk alle Festplatten und Mounts auslesen und nach dem Typ Filtern. Dann kannst Du in einer Schleife alle Pfade mit dem ermittelten Laufwerksbuchstaben testen.

    Grüße

    Ali

    Mittwoch, 20. November 2013 11:23