Get-ChildItem con Join-Path estaba trabajando sobre todo para mí, pero me di cuenta que estaba copiando los directorios raíz dentro de los otros directorios raíz, que era mala.
Por ejemplo
Objetivo: Copiar todos los childitem Dentro c: \ SomeFolder \ CopyInHere a la raíz de d: \ PutItInHere, pero sin incluir c: \ SomeFolder \ CopyInHere sí mismo.
- P. ej. Tome todos los hijos de CopyInHere y conviértalos en Children of PutItInHere
Los ejemplos anteriores hacen esto la mayor parte del camino, pero lo que ocurre es que crea una carpeta llamada SubFolder y crea una carpeta en la carpeta denominada SubFolder.
Esto se debe a Join-Path Calcula una ruta de destino de d: \ PutItInHere \ SubFolder para el elemento secundario SubFolder, para que SubFolder se cree en una carpeta llamada SubFolder.
Me salí al paso utilizando Get-ChildItems para traer de vuelta una colección de los elementos, luego usando un bucle para revisarlo.
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
}
Lo que hace en resumen, es que utiliza el nombre completo del elemento actual para el cálculo del destino. Sin embargo, luego verifica si es un objeto DirectoryInfo. Si es que comprueba si su Carpeta principal es el Directorio de origen, eso significa que la carpeta actual que se está iterando es un elemento secundario directo del directorio de origen, por lo tanto, no debemos agregar su nombre al directorio de destino, porque queremos que esa carpeta sea creado en el directorio de destino, no en una carpeta de su directorio de destino.
Después de eso, cualquier otra carpeta funcionará bien.
Eso era sólo la solución que iba a publicar. :) He encontrado que -Include y -Exclude no funcionan bien para Select-String, Copy-Item y algunos otros comandos. Funciona bien para Get-ChildItem (dir). – JasonMArcher
IIRC, si mira el archivo de ayuda para esos cmdlets, dicen que esos parámetros no funcionan como se esperaba. Enviar es elegir –
Gracias Aaron, ¡eso funcionó a la perfección! – Guy