2012-02-14 93 views
6

que estoy tratando de copiar todos los archivos y carpetas de salida acumulación en una carpetaBin (OutputDir/Bin) a excepción de algunos archivos que permanecen en el OutputDir. La carpeta Bin nunca se eliminará.Powershell: mover archivos de forma recursiva

condición inicial:

Output 
    config.log4net 
    file1.txt 
    file2.txt 
    file3.dll 
    ProjectXXX.exe 
    en 
     foo.txt 
    fr 
     foo.txt 
    de 
     foo.txt 

Objetivo:

Output 
    Bin 
     file1.txt 
     file2.txt 
     file3.dll 
     en 
     foo.txt 
     fr 
     foo.txt 
     de 
     foo.txt 
    config.log4net 
    ProjectXXX.exe 

Mi primer intento:

$binaries = $args[0] 
$binFolderName = "bin" 
$binFolderPath = Join-Path $binaries $binFolderName 

New-Item $binFolderPath -ItemType Directory 

Get-Childitem -Path $binaries | ? {$_.Name -notlike "ProjectXXX.*" -and $_.Name -ne "config.log4net" -and $_.Name -ne $binFolderName } | Move-Item -Destination $binFolderPath 

esto sin t trabajo, porque Move-Item no puede sobreescribir carpetas.

Mi segundo intento:

function MoveItemsInDirectory { 
    param([Parameter(Mandatory=$true, Position=0)][System.String]$SourceDirectoryPath, 
      [Parameter(Mandatory=$true, Position=1)][System.String]$DestinationDirectoryPath, 
      [Parameter(Mandatory=$false, Position=2)][System.Array]$ExcludeFiles) 
    Get-ChildItem -Path $SourceDirectoryPath -Exclude $ExcludeFiles | %{ 
     if ($_ -is [System.IO.FileInfo]) { 
      $newFilePath = Join-Path $DestinationDirectoryPath $_.Name 
      xcopy $_.FullName $newFilePath /Y 
      Remove-Item $_ -Force -Confirm:$false 
     } 
     else 
     { 
      $folderName = $_.Name 
      $folderPath = Join-Path $DestinationDirectoryPath $folderName 

      MoveItemsInDirectory -SourceDirectoryPath $_.FullName -DestinationDirectoryPath $folderPath -ExcludeFiles $ExcludeFiles 
      Remove-Item $_ -Force -Confirm:$false 
     } 
    } 
} 

$binaries = $args[0] 
$binFolderName = "bin" 
$binFolderPath = Join-Path $binaries $binFolderName 
$excludeFiles = @("ProjectXXX.*", "config.log4net", $binFolderName) 

MoveItemsInDirectory $binaries $binFolderPath $excludeFiles 

¿Hay alguna forma alternativa de mover archivos de forma recursiva de una manera más fácil usando PowerShell?

+0

Si muestra un ejemplo de estructura de carpetas de cómo es y cómo quieres que termine siendo, ayudaría a obtener la respuesta que necesitas. –

Respuesta

6

Se puede sustituir el comando Move-Item con un comando Copy-Item y después de eso, puede eliminar los archivos que movió simplemente llamando Remove-Item:

$a = ls | ? {$_.Name -notlike "ProjectXXX.*" -and $_.Name -ne "config.log4net" -and $_.Name -ne $binFolderName } 
$a | cp -Recurse -Destination bin -Force 
rm $a -r -force -Confirm:$false 
+0

Voto a favor tuyo, el único inconveniente es que tu filtro solo se aplica a los elementos en la raíz, y no aplica el filtro recursivamente. –

0

Como ya se ha indicado, Move-Item no sobrescribirá las carpetas, por lo que quedará copiado. Una solución alternativa sería llamar a Robocopy para cada archivo en su bucle for-each con el modificador/MOV (entre otros!); esto se moverá y luego eliminará el archivo fuente.

Cuestiones relacionadas