Get-ChildItem con Join-Path stava lavorando per lo più per me, ma ho capito che era la copia di directory principali all'interno delle altre directory principali, che era male.
Per esempio
Obiettivo: Copia ogni childitem All'interno c: \ SomeFolder \ CopyInHere alla radice del d: \ PutItInHere, esclusi i C: \ SomeFolder \ CopyInHere stesso.
- E.g. Prendi tutti i figli di CopyInHere e rendili Children of PutItInHere
Gli esempi precedenti lo fanno quasi tutto, ma ciò che accade è Crea una cartella chiamata sottocartella e crea una cartella in una cartella chiamata sottocartella.
Ecco perché Join-Path Calcola un percorso di destinazione di d: \ PutItInHere \ SubFolder per l'elemento secondario Sottocartella, quindi Sottocartella get viene creata in una cartella denominata Sottocartella.
Ho risolto questo problema utilizzando Get-ChildItems per riportare una raccolta degli elementi, quindi utilizzando un ciclo per passarci attraverso.
Param(
[Parameter(Mandatory=$True,Position=1)][string]$sourceDirectory,
[Parameter(Mandatory=$True,Position=2)][string]$destinationDirectory
)
$sourceDI = [System.IO.DirectoryInfo]$sourceDirectory
$destinationDI = [System.IO.DirectoryInfo]$destinationDirectory
$itemsToCopy = Get-ChildItem $sourceDirectory -Recurse -Exclude @('*.cs', 'Views\Mimicry\*')
foreach ($item in $itemsToCopy){
$subPath = $item.FullName.Substring($sourceDI.FullName.Length)
$destination = Join-Path $destinationDirectory $subPath
if ($item -is [System.IO.DirectoryInfo]){
$itemDI = [System.IO.DirectoryInfo]$item
if ($itemDI.Parent.FullName.TrimEnd("\") -eq $sourceDI.FullName.TrimEnd("\")){
$destination = $destinationDI.FullName
}
}
$itemOutput = New-Object PSObject
$itemOutput | Add-Member -Type NoteProperty -Name Source -Value $item.FullName
$itemOutput | Add-Member -Type NoteProperty -Name Destination -Value $destination
$itemOutput | Format-List
Copy-Item -Path $item.FullName -Destination $destination -Force
}
In breve, utilizza il nome completo dell'elemento corrente per il calcolo della destinazione. Tuttavia, verifica quindi se è un oggetto DirectoryInfo. Se si verifica se la cartella principale è la directory di origine, significa che la cartella corrente che viene iterata è figlia diretta della directory di origine, in quanto tale non dovremmo aggiungere il nome alla directory di destinazione, perché vogliamo che quella cartella sia creato nella directory di destinazione, non in una cartella di esso nella directory di destinazione.
In seguito, ogni altra cartella funzionerà correttamente.
fonte
2014-05-22 02:34:26
Quella era solo la soluzione che stavo per postare. :) Ho trovato che -Include ed -Exclude non funzionano correttamente per Select-String, Copy-Item e alcuni altri comandi. Funziona correttamente con Get-ChildItem (dir). – JasonMArcher
IIRC, se si guarda il file della guida per quei cmdlet, questi parametri non funzionano come previsto. Spedire è scegliere. –
Grazie Aaron - ha funzionato perfettamente! – Guy