Ich benutze gerne alle Powershell-Befehle, wenn ich kann. Nach ein paar Tests ist dies das Beste, was ich tun kann.
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter}
foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination}
Die ersten drei Zeilen dienen lediglich der besseren Lesbarkeit. Sie können die Variablen in den eigentlichen Befehlen definieren, wenn Sie möchten. Der Schlüssel zu diesem Codebeispiel ist der Befehl "Where-Object", ein Filter, der den Abgleich regulärer Ausdrücke akzeptiert. Es sollte beachtet werden, dass die Unterstützung regulärer Ausdrücke etwas seltsam ist. Ich habe hier eine PDF-Referenzkarte gefunden , die die unterstützten Zeichen auf der linken Seite enthält.
[BEARBEITEN]
Wie "@Johannes Rössel" erwähnt hat, können Sie auch die letzten beiden Zeilen auf eine einzige Zeile reduzieren.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
Der Hauptunterschied besteht darin, dass Johannes Art und Weise Objekte filtert und meine Art Text filtert. Bei der Arbeit mit Powershell ist es fast immer besser, Objekte zu verwenden.
[EDIT2]
Wie in @smoknheap erwähnt, reduzieren die oben genannten Skripte die Ordnerstruktur und legen alle Ihre Dateien in einem Ordner ab. Ich bin nicht sicher, ob es einen Schalter gibt, der die Ordnerstruktur beibehält. Ich habe den -Recurse-Schalter ausprobiert und es hilft nicht. Die einzige Möglichkeit, dies zum Laufen zu bringen, besteht darin, zur Zeichenfolgenmanipulation zurückzukehren und meinem Filter Ordner hinzuzufügen.
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
Ich bin mir sicher, dass es einen eleganteren Weg gibt, dies zu tun, aber nach meinen Tests funktioniert es. Es sammelt alles und filtert dann sowohl nach Namensübereinstimmungen als auch nach Ordnerobjekten. Ich musste die ToString () -Methode verwenden, um Zugriff auf die String-Manipulation zu erhalten.
[EDIT3]
Wenn Sie nun den Pfad melden möchten, um sicherzustellen, dass alles korrekt ist. Sie können den Befehl "Write-Host" verwenden. Hier ist der Code, der Ihnen einige Hinweise gibt, was los ist.
cls
$source = "C:\test"
$destination = "C:\test2"
$filter = [regex] "^[0-9]{6}\.(jpg|gif)"
$bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)}
foreach ($item in $bin) {
Write-Host "
----
Obj: $item
Path: "$item.fullname"
Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"")
}
Dies sollte die relevanten Zeichenfolgen zurückgeben. Wenn Sie irgendwo nichts bekommen, wissen Sie, mit welchem Artikel Probleme auftreten.
Hoffe das hilft