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-Key: 4578830745

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

Printed on: April 27, 2024 at 12:04 o'clock

Member: TK1987
Solution TK1987 Nov 11, 2022 updated at 07:05:48 (UTC)
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
Member: charmeur
charmeur Nov 11, 2022 at 11:52:42 (UTC)
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
Member: TK1987
Solution TK1987 Nov 11, 2022 updated at 12:17:01 (UTC)
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