2013-07-24 4 views
15

Sto faticando molto per ottenere questo script sotto lavorato per copiare i file in cartelle e sottocartelle nella struttura corretta (come server di origine).Copia-elemento File in cartelle e sottocartelle nella stessa struttura di directory del server di origine utilizzando Powershell

consente di dire, ci sono le cartelle di seguito indicate:

principale Cartella: File aaa, File bbb

Sub Folder una: File 1, File 2, File 3

Sub Folder B: File 4, 5 file, file 6

script utilizzato:

Get-ChildItem -Path \\Server1\Test -recurse | ForEach-Object { 
Copy-Item -LiteralPath $_.FullName -Destination \\server2\test | 
Get-Acl -Path $_.FullName | Set-Acl -Path "\\server2\test\$(Split-Path -Path $_.FullName -Leaf)" 

} 

di uscita: aaa file, File bbb

Sub Folder A (Empty Folder)

Sub Folder b (Empty Folder)

File 1, File 2, file 3, file 4, File 5, file 6.

Desidero che i file vengano copiati nelle rispettive cartelle (come le cartelle di origine). Ogni ulteriore aiuto è molto apprezzato.

+0

Se si desidera copiare tutto, la risposta di Kevin_ dovrebbe funzionare. Se hai bisogno di filtrare l'input, consulta http://stackoverflow.com/questions/17788208/moving-jpgs-using-powershell-script-with-variable-directories – Eris

+0

@Kevin_ campione completo usando ** robocopy ** in powershell? – Kiquenet

risposta

41

Questo può essere fatto usando solo Copia-Elemento. Non è necessario utilizzare Get-Childitem. Penso che tu stia solo pensando troppo.

Copy-Item -Path C:\MyFolder -Destination \\Server\MyFolder -recurse -Force 

ho appena provato e ha funzionato per me.

+20

Ho trovato che il comportamento di questo comando cambia se lo si esegue più di una volta. La prima volta, verrà copiato tutto su \\ Server \ MyFolder. La seconda e successive volte copierà tutto su \\ Server \ MyFolder \ MyFolder – thecodefish

+0

@thecodefish Ho notato anche questo, ma succede solo se la directory di destinazione non esiste. Usando New-Item -ItemType Directory -Path $ target -Force | Out-Null risolverà il problema. -Force switch creerà la directory solo se non esiste e Out-Null non inquinerà il tuo output. – Indy411

+0

Funziona anche con la corrispondenza del modello come "Copia-Elemento **/*. Txt -Destinazione C:/destinazione' –

-2

Volevo una soluzione per copiare i file modificati dopo una certa data e ora, il che significa che ho bisogno di utilizzare Get-ChildItem convogliato attraverso un filtro. Di seguito è riportato quello che è venuto fuori:

$SourceFolder = "C:\Users\RCoode\Documents\Visual Studio 2010\Projects\MyProject" 
$ArchiveFolder = "J:\Temp\Robin\Deploy\MyProject" 
$ChangesStarted = New-Object System.DateTime(2013,10,16,11,0,0) 
$IncludeFiles = ("*.vb","*.cs","*.aspx","*.js","*.css") 

Get-ChildItem $SourceFolder -Recurse -Include $IncludeFiles | Where-Object {$_.LastWriteTime -gt $ChangesStarted} | ForEach-Object { 
    $PathArray = $_.FullName.Replace($SourceFolder,"").ToString().Split('\') 

    $Folder = $ArchiveFolder 

    for ($i=1; $i -lt $PathArray.length-1; $i++) { 
     $Folder += "\" + $PathArray[$i] 
     if (!(Test-Path $Folder)) { 
      New-Item -ItemType directory -Path $Folder 
     } 
    } 
    $NewPath = Join-Path $ArchiveFolder $_.FullName.Replace($SourceFolder,"") 

    Copy-Item $_.FullName -Destination $NewPath 
} 
0

Se si desidera eseguire il mirroring dello stesso contenuto dall'origine alla destinazione, provare a seguirne uno.

function CopyFilesToFolder ($fromFolder, $toFolder) { 
    $childItems = Get-ChildItem $fromFolder 
    $childItems | ForEach-Object { 
     Copy-Item -Path $_.FullName -Destination $toFolder -Recurse -Force 
    } 
} 

prova:

CopyFilesToFolder "C:\temp\q" "c:\temp\w"