charmeur
Goto Top

Kopieren - Vergleichen mit PS

Ich möchte erreichen das ich verschiedene Dateien mit Name "XY" oder "QW" auf bestimmten Laufwerke Suche, und nach Laufwerk "Z" Kopiert werden, sind diese dort schon vorhanden und identisch soll keine Kopie gezogen werden.


$search = "*XY*","*2*"  
$pathes = "C:\Users\Thoma\OneDrive\Desktop\1\1","C:\Users\Thoma\OneDrive\Desktop\1\2","C:\Users\Thoma\OneDrive\Desktop\1\3","C:\Users\Thoma\OneDrive\Desktop\1\4"  
$ziel = "C:\Users\Thoma\OneDrive\Desktop\2\Ziel"  
md $ziel -Force

$testdatei = Get-ChildItem -Path $ziel 
If (Test-Path $testdatei)
{
    Write-Host -BackGroundColor Green "Die Datei $($testdatei) existiert."  
}
else
{
Get-ChildItem -Path $pathes -File -Recurse -Force -Include $search |copy-item -Destination $ziel -verbose -passthru

    Write-Host -BackgroundColor Red "Die Datei $($testdatei) existiert bisher nicht."  
}

Er ist nicht schön... ich kein Profi.... also .....

leider erkennt es nur, wenn die erste Datei die gesucht werden soll nicht vorhanden ist, und löst nur dann den nächsten Punkt aus.

...
Habe das ganze schon versucht mit Batch, jedoch wurde mir dann geraten mit PS das zu machen....

Content-ID: 4578830745

Url: https://administrator.de/contentid/4578830745

Ausgedruckt am: 22.11.2024 um 15:11 Uhr

TK1987
Lösung TK1987 11.11.2022 aktualisiert um 08:05:48 Uhr
Goto Top
Moin,

Habe das ganze schon versucht mit Batch, jedoch wurde mir dann geraten mit PS das zu machen....
ein guter Rat. Warum PowerShell und nicht Batch?

Das geht wie folgt:
$Search = "*XY*","*2*"  
$Pathes = @(
  "$ENV:OneDrive\Desktop\1\1"  
  "$ENV:OneDrive\Desktop\1\2"  
  "$ENV:OneDrive\Desktop\1\3"  
  "$ENV:OneDrive\Desktop\1\4"  
)
$Ziel = "$ENV:Onedrive\Desktop\2\Ziel"  

Foreach ($Path in $Pathes) {
  Foreach ($File in Get-ChildItem -File -Path "$Path\*" -include $Search) {  
    $Zieldatei = $File.Fullname.Replace($Path,$Ziel)
    if (!(Test-Path $Zieldatei) -or (Get-Item $Zieldatei).LastWriteTime -lt $File.LastWriteTime) {
      Write-Host -B Red "Die Datei ""$Zieldatei"" existiert nicht. "  
      Copy-Item -Path $File -Destination $Zieldatei
    } else {
      Write-Host -B Green "Die Datei ""$Zieldatei"" existiert. "  
    }
  }
}
Ich würde allerdings eher mit Foregroundcolor arbeiten, als mit Backgroundcolor.

BTW: Hast du schon mal einen Blick in unseren Leitfaden geworfen? Powershell Leitfaden für Anfänger

Gruß Thomas
charmeur
charmeur 11.11.2022 um 12:52:42 Uhr
Goto Top
Ok danke für die das Script, gibt es auch die Möglichkeiten die unterordner bei der Suche mit einzubeziehen ?


Das mit den Farben spielt vorerst keine Rolle für mich, die Funtion wäre mir wichtiger
@ich denke für mich ist das hoffnungslos, in Sachen PS einzulesen ich verstehe nur Bahnhof, und ich bin echt froh das es Menschen gibt wie dich.


Danke
TK1987
Lösung TK1987 11.11.2022 aktualisiert um 13:17:01 Uhr
Goto Top
Zitat von @charmeur:
Ok danke für die das Script, gibt es auch die Möglichkeiten die unterordner bei der Suche mit einzubeziehen ?
Selbstverständlich geht das. Dafür gibt es bei Get-ChildItem den "-Recurse"-Parameter.

Beachte aber, das man die Dateien nur kopieren kann, wenn der Unterordner im Ziel bereits existiert.

Das heisst: Du musst...
  • entweder überprüfen, ob der Zielordner existiert; und falls nicht diesen dann erstellen
  • oder als kleinen Trick einfach vor dem Kopiervorgang mit New-Item und dem "-Force"-Parameter eine leere Zieldatei erstellen. Dabei werden ggfs. nicht existierende Unterordner automatisch erstellt.
$Search = "*XY*","*2*"  
$Pathes = @(
  "$ENV:OneDrive\Desktop\1\1"  
  "$ENV:OneDrive\Desktop\1\2"  
  "$ENV:OneDrive\Desktop\1\3"  
  "$ENV:OneDrive\Desktop\1\4"  
)
$Ziel = "$ENV:Onedrive\Desktop\2\Ziel"  

Foreach ($Path in $Pathes) {
  Foreach ($File in Get-ChildItem -Recurse -File -Path "$Path\*" -include $Search) {  
    $Zieldatei = $File.Fullname.Replace($Path,$Ziel)
    if (!(Test-Path $Zieldatei)) {
      Write-Host -B Red "Die Datei ""$Zieldatei"" existiert nicht. "  
      [void](New-Item -ItemType File -Force $Zieldatei)
      Copy-Item -Path $File -Destination $Zieldatei
    } ElseIf ((Get-Item $Zieldatei).LastWriteTime -lt $File.LastWriteTime) {
      Write-Host -B Red "Die Datei ""$Zieldatei"" wurde verändert. "  
      Copy-Item -Path $File -Destination $Zieldatei
    } else {
      Write-Host -B Green "Die Datei ""$Zieldatei"" existiert. "  
    }
  }
}

Gruß Thomas
Serie: Kopieren mit PS
Kopieren - Vergleichen mit PS3