Mi piace usare tutti i comandi di Powershell quando posso. Dopo un po 'di test, questo è il massimo che posso fare.
$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}
Le prime tre righe servono solo a semplificare la lettura, è possibile definire le variabili all'interno dei comandi effettivi, se lo si desidera. La chiave di questo esempio di codice è il comando "Where-Object" che è un filtro che accetta la corrispondenza delle espressioni regolari. Va notato che il supporto per le espressioni regolari è un po 'strano. Ho trovato una scheda di riferimento PDF qui che ha i caratteri supportati sul lato sinistro.
[MODIFICARE]
Come menzionato "@Johannes Rössel", puoi anche ridurre le ultime due righe a una sola riga.
((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination
La differenza principale è che il modo di Johannes fa il filtro degli oggetti e il mio il filtro del testo. Quando si lavora con Powershell, è quasi sempre meglio usare oggetti.
[EDIT2]
Come menzionato @smoknheap, gli script precedenti appiattiranno la struttura delle cartelle e metteranno tutti i tuoi file in una cartella. Non sono sicuro se esiste un interruttore che mantiene la struttura delle cartelle. Ho provato l'opzione -Recurse e non aiuta. L'unico modo per farlo funzionare è tornare alla manipolazione delle stringhe e aggiungere cartelle al mio filtro.
$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,"")
}
Sono sicuro che esiste un modo più elegante per farlo, ma dai miei test funziona. Raccoglie tutto e quindi filtra sia le corrispondenze dei nomi sia gli oggetti delle cartelle. Ho dovuto usare il metodo ToString () per accedere alla manipolazione delle stringhe.
[Edit3]
Ora se vuoi segnalare il percorso per assicurarti di avere tutto corretto. È possibile utilizzare il comando "Write-Host". Ecco il codice che ti darà alcuni suggerimenti su cosa sta succedendo.
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,"")
}
Questo dovrebbe restituire le stringhe pertinenti. Se non ottieni nulla da qualche parte, saprai con quale oggetto si verificano problemi.
Spero che questo ti aiuti