Powershell nur kopieren wen datei nicht existiert und sonst archivieren

Retsam-Master

Banned
Registriert
Jan. 2019
Beiträge
1.100
Hallo zusammen

ich möchte von einem Pfad C:\pfad1 Dateien nach C:\Pfad2 kopieren ...aber wen die Datei in pfad1 schon existiert, soll sie in C:\Pfad3 verschoben werden.
Existiert die Datei auch in Pfad3 soll sie gelöst werden.

Ich hab mal was angefangen aber nicht mal der Anfang scheint zu klappen.
Also hab ich es beim Else befehl nicht beendet.
warscheinlich bin ich komplett auf dem Holzweg

Hier unten im Code beschreibe ich nur den Versuch die Prüfung zwischen Pfad 1 und 3 zu erreichen.
Was leider nicht klappt
Evt. gibt es ne viel bessere Idee

PowerShell:
$path1 = "C:\Path1"
$Archiv = "C:\Path3"
$var1 = GCI -Path $path1 -File

foreach ($f in $var1)
{
        if (-not (Test-Path "C:\Path3\$var1"))
        {
            copy -Path $Path1\*.PDF -Destination $Path3
        }
        else
        {
            weiter im befehl ...löschen etc.
        }
}
 
Deine Beschreibung ist etwas durcheinander, du meinst sicher: ".. wenn die Datei in Pfad2 bereits existiert...".
Erster Tipp: Bezeichne im Skript deine Variablen doch mit klaren Namen, was sie beinhalten. Meinetwegen $quellPfad, $zielPfad, $archivPfad. In deinem Skript kopierst du auch gleich alle PDF "*.PDF" auf einen Rutsch. Auch die Pfade sind alle durcheinander.
 
Also das Problem ist folgendes....
Im Quellpfad kann eine Datei sein... diese Datei will ich im Zielpfad haben.
Wen die Datei aber im Zielpfad existiert soll sie in Archivpfad abgelegt werden.
Wen sie auch da existiert soll Sie gelöst werden.
Warum ich das mache hat folgenden Problemgrund:
Im Quellpfad kann datei xyz.xml sein ...aber am nächsten Tag KÖNNTE die Datei wieder drin sein und dann will ich sie ins Zielpfad haben da sonst ein Skriptfehler entsteht und die Datei logischerweise nicht kopiert wird und dann verweilt sie im Quellpfad.

Ich hab jetzt gestern sehr lange versucht und das oben ist etwas das Skript was ich hinbekommen hab aber nicht funktioniert 🤣
 
Ohne Garantie, Gewähr und Lottogewinn. Teste die Funktion bitte nicht mit deinen wertvollen Daten.

PowerShell:
$sourceFolder = "D:\copytest\Source"
$destinationFolder = "D:\copytest\Destination"
$archiveFolder = "D:\copytest\Archive"

foreach ($sourceFile in (Get-ChildItem -File -Path $sourceFolder))
{
    $destinationFile = Join-Path $destinationFolder $sourceFile.Name

    #Prüfen ob die Datei bereits im Zielvereichnis liegt
    if (Test-Path -Path $destinationFile)
    {
        $archiveFile = Join-Path $archiveFolder $sourceFile.Name
        
        # Prüfen ob die Datei bereits im Archiv liegt
        if (Test-Path -Path $archiveFile) # Ja = löschen
        {
            
            Write-Host Removing archived $archiveFile
            Remove-Item -Path $archiveFile

        }
        else # Nein = ins Archiv schubsen
        {
            Write-Host Moving to archive $destinationFile
            Move-Item -Path $destinationFile -Destination $archiveFolder
        }
        
    }
    Write-Host Copying to destination $destinationFile
    
    # ggf. durch Move-Item ersetzen wenn die Datei verschoben werden soll,
    # sprich aus dem Quellverzeichnis verschwinden
    Copy-Item -Path $sourceFile.FullName -Destination $destinationFolder
}
 
@DaZpoon
Wow fast perfekt wie ich es haben möchte...
habs grad getestet...
Dürfte ich noch kurz was nachfragen?

Danke schon mal an dieser Stelle..
da ist noch ein Denktfehler irgendwie drin.

Die daten sollen nach dem Kopieren aus dem Quellverzeichnis gelöst werden (damit der danach immer leer ist) bei dem Skript werden sie im Archivordner gelöst was verkehrt ist.

also muss ich nur das hier ändern:
Write-Host Removing archived $archiveFile
Remove-Item -Path $archiveFile
durch $sourcefolder statt $archivfile?

und wie lösche ich es schon nach dem ersten kopieren?

und noch als Erläuterung wofür wird Join-Path verwendet? kenne das so nicht.
 
Ich hoffe ich habe den Grundstock gelegt für weitere Modifikationen nach deinen Vorstellungen, denn ehrlich gesagt leuchtet mir die Logik nicht vollständig ein.
Wenn sie aus dem Quellverzeichnis gelöscht werden sollen, kannst du entweder Move-Path (verschieben) nehmen oder explizit mit Remove-Item löschen.

Join-Path verknüpft zwei Pfade. Kurz: Es macht den Backslash dazwischen bzw. entfernt auch unnötige:
Code:
>> Join-Path "OrdnerA\" "\OrdnerB"
OrdnerA\OrdnerB
Ist halt etwas cleaner, muss man nicht unbedingt machen.

Bei dem Skript musst du unbedingt darauf achten dass:
  • Alle 3 Ordner existieren
  • Die 3 Pfadangaben absolute Pfade sind (!!!) Sonst wird ggf. was falsches gelöscht.
 
@DaZpoon
Ich danke dir vielmals 🧡
Hast mir sehr geholfen
 
Zurück
Oben