Jump to content

PowerShell Ordner und Unterordner vergleichen Name/Erstellungsdatum


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen, 

 

ich habe Hilfe gesucht und dann bin auf diese Forum angestoßen. 

Ich bin nicht so gut in PowerShell und komme nicht mehr weiter, kann mir jemand bitte weiter helfen?

 

Ich versuche Name und Erstellungsdatum auch vergleichen aber bekomme nicht hin und weiß es nicht mehr, wie ich weiter komme. 
 

 

$Folder1Path = 'C:\test1'
$Folder2Path = 'C:\test2'

$Folder1Files = Get-childitem -Path $Folder1Path
$Folder2Files = Get-childitem -Path $Folder2Path

$FileDiffs = Compare-Object -ReferenceObject $Folder1Files -DifferenceObject $Folder2Files

$FileDiffs | foreach { 
    $copyParams =@{
        'Path' = $_.InputObject.FullName
    }
    if ($_.SideIndicator -eq '<=')
    {
        $copyParams.Destination =$Folder2Path
    }
    Copy-Item @copyParams
}

 

 

Link zu diesem Kommentar

Hallo Schepper. Willkommen im MCSEBoard.  :spock:

 

Was willst Du denn eigentlich erreichen? Möchtest Du die beiden Verzeichnisse synchronisieren? Dafür kann man robocopy benutzen. Wenn Du mit Compare-Object den Namen und das Erstellungsdatum vergleichen möchtest, solltest Du im Parameter -Property die Attribute angeben die Du vergleichen möchtest - also Name und CreationTime

Link zu diesem Kommentar
vor 35 Minuten schrieb schepper:

Ja, es geht um halt beiden Verzeichnisse synchronisieren.

Dafür ist robocopy hervorragend geeignet.    ;-) :thumb1:

 

vor 36 Minuten schrieb schepper:

Und weißt du warum, dass die Unterordner nicht verglichen werden? 

Ja. Get-ChildItem liefert standardmäßig nur die Dateien und Ordner im angegebenen Pfad. Wenn Du Unterordner einschließen möchtest, musst Du den Parameter -Recurse angeben. 

Link zu diesem Kommentar
$Folder1Path = 'C:\test1'
$Folder2Path = 'C:\test2'

$Folder1Files = Get-childitem -Path $Folder1Path
$Folder2Files = Get-childitem -Path $Folder2Path

$FileDiffs = Compare-Object -ReferenceObject $Folder1Files -DifferenceObject $Folder2Files

$FileDiffs | foreach { 
    $copyParams =@{
        'Path' = $_.InputObject.FullName
    }
    if ($_.SideIndicator -eq '<=')
    {
        $copyParams.Destination =$Folder2Path
    }
    Copy-Item @copyParams
}

 

oben neben "Get-childitem -Recurse" geschrieben. Sollte doch da oben kommen oder weiß ich das falsch? 

Link zu diesem Kommentar

Wie schon geschrieben - wenn es Dir um eine Synchronisation geht, solltest Du Dir robocopy anschauen. Das ist speziell für diesen Zweck entwickelt worden. Ein aufwändiges/potenziell fehleranfälliges Script ist dafür nicht nötig.

 

Davon unabhängig - wenn Du die Ergebnis-Objekte filtern möchtest, kannst Du Where-Object verwenden:

$Folder1Path = 'C:\test1'
$Folder2Path = 'C:\test2'

$Folder1Files = Get-childitem -Path $Folder1Path -Recurse
$Folder2Files = Get-childitem -Path $Folder2Path -Recurse

Compare-Object -ReferenceObject $Folder1Files -DifferenceObject $Folder2Files |
    Where-Object -Property SideIndicator -EQ -Value '<=' |
        ForEach-Object {
            Copy-Item -Path $_.InputObject.FullName -Destination $Folder2Path
        }

 

Link zu diesem Kommentar

Ich habe mir robocopy angeschaut. Davon habe ich erstmal von dir gehört. Sieht besser als PowerShell und einfacher. 

 

vor 47 Minuten schrieb BOfH_666:

Davon unabhängig - wenn Du die Ergebnis-Objekte filtern möchtest, kannst Du Where-Object verwenden:


$Folder1Path = 'C:\test1'
$Folder2Path = 'C:\test2'

$Folder1Files = Get-childitem -Path $Folder1Path -Recurse
$Folder2Files = Get-childitem -Path $Folder2Path -Recurse

Compare-Object -ReferenceObject $Folder1Files -DifferenceObject $Folder2Files |
    Where-Object -Property SideIndicator -EQ -Value '<=' |
        ForEach-Object {
            Copy-Item -Path $_.InputObject.FullName -Destination $Folder2Path
        }

 

Das funktioniert aber da gibt ein kleines Problem. Z.B. 'C:\test1\ordner1\text.txt' diese Text Datei wird direkt 'C:\test2' kopiert nicht in  'C:\test1\ordner1'. 

 

 

 

PS: Ignoriert bitte mein Hochdeutsch! 
 

@BOfH_666 ich teste gerade mit robocopy. Es funktioniert perfekt und genau wie ich es möchte. Muss nur noch ein kleines Skript draus erstellen und nur mit ein klick im Hintergrund laufenlassen. 

 

Danke dir @BOfH_666 nochmal! ^^

Link zu diesem Kommentar
Am 22.11.2021 um 13:24 schrieb schepper:

Z.B. 'C:\test1\ordner1\text.txt' diese Text Datei wird direkt 'C:\test2' kopiert nicht in  'C:\test1\ordner1'. 

 

Muß ja auch so sein, wenn das Ziel immer $Folder2Path ist :-) Da mußt Du dann schon etwas "Pfadmassage" betreiben. Aber über Robocopy wurde genug gesagt, es muß nicht immer ein Skript sein :thumb1:

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...