Jump to content

PowerShell Ordner und Unterordner vergleichen Name/Erstellungsdatum


Recommended Posts

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 to post

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 to post

Danke @BOfH_666 

 

Ja, es geht um halt beiden Verzeichnisse synchronisieren. Test2 Verzeichnis ist ein Software Verzeichnis und Test1 ist neue Version. Es ist halt so, das in Test1 Ordner(Update) werden nicht alle Inhalt bearbeitet nur paar Sachen.

Okay, ich probiere. Und weißt du warum, dass die Unterordner nicht verglichen werden? 

Link to post
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 to post
vor 7 Minuten schrieb BOfH_666:

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. 

das habe ich schon mal getestet aber funktioniert nicht 

Link to post
$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 to post

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 to post

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! ^^

  • Like 1
Link to post
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 to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...