В моем случае у меня уже была создана целевая папка, и у меня все еще были проблемы. Тем не менее, я не добавил *, и это имело значение.

я есть набор проектов, которые включают в себя смесь файлов, специфичных для проекта, плюс общие файлы. Я пытаюсь скопировать содержимое из двух разных папок - определенной для проекта папки и общей папки - в одну папку с именем для проекта. Я также хочу сохранить любые иерархии папок из исходных папок.

Например, некоторые пути к общим файлам:

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

И пример пути к конкретным файлам проекта:

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

Желаемый результат после копирования будет:

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

Я использую вот это:

[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

Но вместо ожидаемых результатов все файлы попадают в дополнительный уровень подпапки:

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

Я в тупике. Я не могу понять, как избавиться от дополнительного слоя подпапки. Я пытался использовать конвейер Get-ChildItem для Copy-Item, но тогда иерархия подпапок была потеряна.

В файле .bat это работает:

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

Я думаю, я мог бы использовать xcopy, но наверняка должен быть способ сделать это с помощью командлетов.

 Peter25 дек. 2017 г., 00:08
Что еще странно, так это то, что при запуске команд в консоли результаты отличаются от сценариев.
 PetSerAl24 дек. 2017 г., 23:47
New-Item bld\ProjectA\pkgFiles -Type Directory; Copy-Item -Path .\src\Common\PackageFile\* bld\ProjectA\pkgFiles -Recurse; Copy-Item -Path .\src\Projects\ProjectA\PackageFiles\* bld\ProjectA\pkgFiles -Recurse

Ответы на вопрос(1)

Решение Вопроса

известная проблема с Windows PowerShell v5.1 / PowerShell Core v6.2.0-preview.2, к сожалению:

Короче говоря,поведениеCopy-Item к сожалению, зависит от того, существует ли уже целевой каталог или нет:

Если цель реж. существует, это не исходный каталогсодержание это скопировано, но источник dir.в целомкподкаталог целевого каталога с именем для исходного каталога.

обходной путь уже в основном прописано вPetSerAlПолезный комментарий к вопросу:

Перед копированием убедитесь, что целевой каталог существует.

присоединять\* к исходному пути, чтобы явно нацелиться насодержание из источника реж.

Также укажите-Forceчтобы обеспечитьскрытый файлы и каталоги также копируются.
$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

# IF desired, clear out the pre-existing directory content.
# !! Beware of Remove-Item's intermittent failures - see below.
#  Remove-Item -Force $pkgContentPath\* -Recurse.

# 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

Примечание повторное использованиеRemove-Item -Recurse при необходимости очистить существующее содержимое каталога назначения:Remove-Item Можнопровал иногда, и вы не можете предсказать, когда это произойдет - смотритеэтот ответ для надежной альтернативы.

 Peter26 дек. 2017 г., 23:17
В моем случае у меня уже была создана целевая папка, и у меня все еще были проблемы. Тем не менее, я не добавил *, и это имело значение.

Ваш ответ на вопрос