2017-12-24 19 views
2

Ich habe eine Reihe von Projekten, die eine Mischung aus projektspezifischen Dateien und gemeinsamen Dateien enthalten. Ich versuche, Inhalte aus zwei verschiedenen Ordnern - einem projektspezifischen Ordner und einem allgemeinen Ordner - in einen einzelnen Ordner zu kopieren, der nach dem Projekt benannt ist. Ich möchte auch alle Ordnerhierarchien aus den ursprünglichen Ordnern beibehalten.unerwartete Struktur beim Kopieren von Ordnern in Windows Powershell

Zum Beispiel, einige Pfade zu den gemeinsamen Dateien:

src\Common\PackageAssets\logo1.jpg 
src\Common\PackageAssets\logo2.jpg 

Und Beispiel Pfade zu projektspezifischen Dateien:

src\Projects\ProjectA\PackageFiles\readme.txt 
src\Projects\ProjectA\PackageFiles\scale-100\projA.png 

Das gewünschte Ergebnis nach dem Kopieren wäre:

bld\ProjectA\pkgFiles\logo1.png 
bld\ProjectA\pkgFiles\logo2.png 
bld\ProjectA\pkgFiles\readme.txt 
bld\ProjectA\pkgFiles\scale-100\projA.png 

Was ich benutze ist dies:

[string]$pkgContentPath = "bld\$project\pkg_contents" 

# copy common files 
Copy-Item -Path .\src\Common\PackageAssets -Recurse -Destination $pkgContentPath 
# copy project-specific files 
Copy-Item -Path .\src\Projects\ProjectA\PackageFiles\ -Recurse -Destination $pkgContentPath 

Doch statt der erwarteten Ergebnisse, werden alle Dateien enden in einem zusätzlichen Ebene von Unterordner bis:

bld\ProjectA\pkgFiles\PackageAssets\logo1.png 
bld\ProjectA\pkgFiles\PackageAssets\logo2.png 
bld\ProjectA\pkgFiles\PackageFiles\readme.txt 
bld\ProjectA\pkgFiles\PackageFiles\scale-100\projA.png 

ich ratlos bin. Ich kann nicht herausfinden, wie ich die zusätzliche Unterordnerschicht los werde. Ich habe versucht, Get-ChildItem-Piping zu Copy-Item zu verwenden, aber dann sind die Unterordnerhierarchien verloren gegangen.

In einer BAT-Datei, das funktioniert:

xcopy src\Common\PackageAssets\* bld\%project\pkg_contents /s 
xcopy src\Projects\%project\PackageFiles bld\%project\pkg_contents /s 

Ich glaube, ich xcopy verwenden könnte, aber sicher muss es eine Möglichkeit geben, diese Cmdlets zu tun.

+1

'New-Item bld \ ProjectA \ pkgFiles -Art-Verzeichnis; Kopiere-Item -Path. \ Src \ Common \ Paketdatei \ * bld \ ProjectA \ pkgFiles -Recurse; Copy-Item -Path. \ Src \ Projekte \ ProjectA \ PackageFiles \ * bld \ ProjectA \ pkgFiles -Recurse' – PetSerAl

+0

Was noch merkwürdig ist, ist, dass die Ergebnisse unterschiedlich sind, wenn ich Befehle in der Konsole statt von einem Skript aus führe. – Peter

Antwort

0

Das Verhalten, das Sie beschreiben, ist ein known bug als der Windows Powershell v5.1/Powershell-Core-v6.0.0-rc.2 leider:

Kurz gesagt, das Verhalten von Copy-Item hängt leider ab, ob die Zielverzeichnis existiert bereits oder nicht:

Wenn das Ziel dir. exists, es ist nicht das Inhalt des Quellverzeichnisses das kopiert wird, aber das Quellverzeichnis. als Ganzes, zu einem Unterverzeichnis des Zielverzeichnisses für das Quellverzeichnis.


Die Abhilfe bereits meist in PetSerAl ist hilfreich Kommentar auf die Frage buchstabiert:

  • vor dem Kopieren, stellen Sie sicher, dass das Zielverzeichnis ist noch vorhanden.

  • Fügen Sie \* an den Quellpfad an, um explizit auf den Inhalt des Quellverzeichnisses zu verweisen.

    • Auch -Force angeben, um zu gewährleisten, dass Dateien und Verzeichnisse werden ebenfalls kopiert versteckt.
$pkgContentPath = "bld\$project\pkg_contents" 

# Make sure the target dir. exists. 
# (-Force leaves an existing dir alone and otherwise creates it.) 
New-Item -Force -Type Directory $pkgContentPath 


# Copy with \* appended to the source paths and -Force added: 

# copy common files 
Copy-Item -Recurse -Force -Path .\src\Common\PackageAssets\* $pkgContentPath 
# copy project-specific files 
Copy-Item -Recurse -Force -Path .\src\Projects\ProjectA\PackageFiles\* $pkgContentPath 
+1

In meinem Fall hatte ich bereits den Zielordner erstellt und hatte immer noch Probleme. Allerdings habe ich nicht angehängt, und das hat den Unterschied gemacht. – Peter

Verwandte Themen