2016-05-06 9 views
3

Ich versuche, ausgewählte Inhalte eines Ordners auf meiner Arbeitsstation auf eine Netzwerkfreigabe zu kopieren.Verwenden Sie PowerShell zum Kopieren von Dateien von Arbeitsstation zu Server unter Beibehaltung der Verzeichnisstruktur

Workstation Ordner:

\ProjectX 
    DocumentA.sql 
    DocumentA.ad 
    \Build 
    DocumentA.csv 

Ich mag würde den Inhalt der ProjectX-\\server\shared\projects\ProjectX (die ProjectX Ordner bereits erstellt wurde) kopieren.

Das gewünschte Ergebnis:

\ProjectX 
    DocumentA.sql 
    \Build 
    DocumentA.csv 

Ich habe versucht:

$destination = '\\server\shared\projects\ProjectX' 

Get-ChildItem '.\*' -Include '*.csv', '*.sql' -Recurse | Foreach { 
    Copy-Item -Path $_ -Destination $destination -Recurse 
} 

Leider führt dies zu:

\ProjectX 
    DocumentA.sql 
    DocumentA.csv 

Was bin ich?

Ich bin nicht interessiert an einer Antwort mit robocopy.

Antwort

2

Es ist ein Schmerz, weil Copy-Item zu dumm ist, den Job richtig zu machen. Das bedeutet, dass Sie die Logik selbst programmieren müssen.

Normalerweise beende ich mit so etwas wie dies oben:

$Source = (Get-Location).Path; 
$Destination = '\\server\shared\projects\ProjectX'; 

Get-ChildItem -Path $Source -Include '*.csv','*.sql' -Recurse | ForEach-Object { 
    # Get the destination file's full name 
    $FileDestination = $_.FullName.Replace($Source,$Destination); 

    # Get the destination file's parent folder 
    $FileDestinationFolder = Split-Path $FileDestination -Parent; 

    #Create the destination file's parent folder if it doesn't exist 
    if (!(Test-Path -Path $FileDestinationFolder)) { 
     New-Item -ItemType Directory -Path $FileDestinationFolder | Out-Null;   
    } 

    # Copy the file 
    Copy-Item -Path $_.FullName -Destination $FileDestination; 
} 

Edit: Ich denke, das wird fehlschlagen, wenn Sie versuchen, ein Unterverzeichnis zu erstellen, wenn die Eltern direkt existiert nicht. Ich überlasse das als Übung für den Leser.

0

Versuchen Sie mit -Container Schalter für Copy-Item Cmdlet.

$destination = '\\server\shared\projects\ProjectX' 

Get-ChildItem '.\*' -Include '*.csv', '*.sql' -Recurse | Foreach { 
    Copy-Item -Path $_ -Destination $destination -Recurse -container 
} 
+0

Der '-Container' Schalter hatte keine Wirkung. – craig