2012-02-14 12 views
6

sto cercando di copiare tutti i file di output di compilazione e le cartelle in una cartella diBin (OutputDir/Bin) ad eccezione di alcuni file che rimangono nella OutputDir. La cartella Bin non verrà mai eliminata.PowerShell: spostare i file in modo ricorsivo

condizione iniziale:

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

Obiettivo:

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

Il mio primo tentativo:

$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 

Questo non fa t lavoro, perché Move-Item non è in grado di sovrascrivere le cartelle.

Il mio secondo tentativo:

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 

C'è un modo alternativo di spostare i file in modo ricorsivo in modo più semplice utilizzando PowerShell?

+0

Se si mostra una struttura di cartella di esempio di come è e poi come vuoi che finisca per essere utile per ottenere la risposta che ti serve. –

risposta

6

Si potrebbe sostituire il comando Move-Item con un comando Copy-Item e dopo di che, è possibile eliminare i file spostati semplicemente chiamando 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 in eccesso per te, l'unico lato negativo è che il tuo filtro si applica solo agli elementi nella radice e non applica il filtro in modo ricorsivo. –

0

Come già detto, Move-Item non sovrascriverà le cartelle in modo da lasciare la copia. Una soluzione alternativa sarebbe chiamare Robocopy per ogni file nel ciclo for-each con l'opzione/MOV (tra gli altri!); questo si sposterà quindi cancellerà il file sorgente.