Как правильно использовать командлет Copy-Item для копирования файлов по конвейеру

Я F:\tempzip небольшой скрипт, который должен копировать все файлы .zip в специальную папку с именем F:\tempzip.

Я попытался сделать это с помощью командлета Copy-Item, но мне не удалось это сделать. Скрипт должен скопировать все файлы из этой папки (рекурсивно), которые являются ".zip".

Это та часть сценария, о которой я говорю:

get-childitem F:\Work\xxx\xxx\xxx -recurse '
   | where {$_.extension -eq ".zip"}       '
   | copy-item F:\tempzip

Что я должен добавить?

Ответ 1

Когда элементы трубопровода на copy-item, вам нужно сказать, что "F:\tempzip" - путь назначения.

| Copy-Item -Destination F:\tempzip

Вы также можете вырезать трубопровод для оператора where с помощью параметра Get-ChildItem -filter.

Get-Childitem "C:\imscript" -recurse -filter "*.zip" | Copy-Item -Destination "F:\tempzip"

Изменить: удаление ненужного цикла foreach и обновленное объяснение.

Ответ 2

Это намного проще. Копировать-элемент имеет свой собственный переключатель -Recurse. Все, что вам нужно сделать, это:

Copy-Item F:\Work\xxx\xxx\xxx\*.zip F:\tempzip -Recurse

Ответ 3

По какой-то причине рекурсия "Копировать-элемент" не выполнила то, что я хотел, как упоминалось здесь, и как она документирована для работы. Если у вас есть куча файлов *.zip или *.jpg в произвольно глубоких иерархиях подпапок, и вы хотите скопировать их в одно место (одна плоская папка, в другом месте), мне повезло с помощью команды piped с участием Get-ChildItem, Предположим, что вы находитесь в папке, содержащей корень вашего поиска:

Get-ChildItem -Recurse -Include *.zip | Copy-Item -Destination C:\Someplace\Else

Эта команда скопирует все файлы и не дублирует иерархии папок.