Мне нужно скопировать только определенные части папки с помощью Powershell, в частности этот список:
$files = @("MyProgram.exe",
"MyProgram.exe.config",
"MyProgram.pdb",
".\XmlConfig\*.xml")
В удобочитаемой форме: 3 конкретных файла MyProgram.*
в корне целевой папки и все файлы XML в папке XmlConfig
, которая сама находится в корне исходного пути (..\bin\Release\
в моем случае). Папка XmlConfig
должна быть создана в месте назначения, если она не существует.
Что я пробовал:
(1) Я пробовал следующее, но это не сработало, т.е. по пути назначения не было создано ни папки, ни файлов:
Copy-Item -Recurse -Path "..\bin\Release\" -Destination ".\Test\" -Include $files
(2) Когда -Include
удаляется, вся структура папок успешно создается, включая подпапки и файлы:
Copy-Item -Recurse -Path "..\bin\Release\" -Destination ".\Test\"
Должно быть, что-то не так с моим пониманием того, как работает фильтр -Include
:
(3) Я проверил предположение, что -Include
нужен массив подстановочных знаков, но это тоже не сработало:
$files = @("*MyProgram.exe*",
"*MyProgram.exe.config*",
"*MyProgram.pdb*",
"*.\XmlConfig\*.xml*")
Посоветуйте, пожалуйста, как правильно сделать Copy-Item
в моем случае.
ОБНОВЛЕНИЕ (на основе ответов ниже):
Я ищу общую реализацию, которая принимает массив строк. Это открывает возможность разместить все необходимые файлы/пути в одном месте для удобного редактирования, чтобы человек, не знающий Powershell, мог понять и изменить его по мере необходимости. Таким образом, в конце концов, это будет один сценарий для выполнения развертывания XCOPY для любого проекта, при этом входной файл будет единственной переменной частью. Для приведенного выше примера входные данные будут выглядеть так (сохранены как input.txt
и переданы в качестве аргумента основному сценарию):
MyProgram.exe
MyProgram.exe.config
MyProgram.pdb
.\XmlConfig\*.xml
Я бы предпочел подход с использованием подстановочных знаков, поскольку не многие люди знают регулярное выражение.