Powershell Copy-Item рекурсивно, но не включает имя папки


20

Это глупый вопрос, но я просто не знаю, почему он не работает.

Я пытаюсь скопировать файлы из FolderA в FolderB рекурсивно. Я делаю это:

Copy-Item -Path "C:\FolderA\" -Destination "C:\FolderB\" -recurse -Force -Verbose

Работает отлично, без проблем.

За исключением результата в FolderB это:

C:\FolderB\FolderA\file.txt

Тогда как я хочу, чтобы это было:

C:\FolderB\file.txt

Какую глупую очевидную вещь я пропускаю?


4
Вы не делаете ничего глупого, copy-item - это просто PITA.
StingyJack

Ответы:


28

Ваша команда говорит PowerShell скопировать саму папку со всем ее содержимым в папку назначения. Чтобы скопировать только содержимое исходной папки, измените путь следующим образом:

Copy-Item -Path "C:\FolderA\*" -Destination "C:\FolderB\" -recurse -Force -Verbose

Обратите внимание на звездочку (*) после имени папки. Это позволит скопировать содержимое (включая подпапки) папки, но не саму папку в папку назначения.

Использование командлета Copy-Item


2
Обратите внимание, что это не копирует структуру папок, если папка назначения не существует. Вызов md "C:\FolderB"до этого, Copy-Itemкажется, позволяет избежать этой проблемы.
zett42

Основываясь на приведенном выше комментарии @ zett42, если целевая папка еще не существует, похоже, она Copy-Itemбудет воспроизводить структуру папок, но на один уровень ниже (например C:\FolderA\B\C, копируется C:\FolderB\Cвместо C:\FolderB\B\C), а также может завершиться ошибкой, если существует несколько подпапок. Всегда проверяйте, существует ли папка назначения перед вызовом Copy-Item. Это пахнет как ошибка (я не вижу никакой причины, почему это противоречивое поведение было бы желательно).
Марк Дурдин

1
Смотрите также комментарий на SO .
Марк Дурдин

0

Вы можете использовать -File -Recurse для копирования только файлов рекурсивно:

Copy-Item -Path "C: \ Source" -Назначение "C: \ Dest" -File -recurse -Force -Verbose

Или используйте -Directory -Recurse для копирования только структуры empy:

Copy-Item -Path "C: \ Source" -Destination "C: \ Dest" -Directory -recurse -Force -Verbose

С уважением,

Пол Педроза


-1
Copy-Item -Path "C:\FolderA" -Destination "C:\FolderB" -recurse -Force -Verbose

Также будет работать.


1
Похоже, что это комментарий к аналогичному ответу FastEthernet. Если вы хотите предложить альтернативный ответ, вы должны объяснить, почему он отвечает на вопрос.
Blackwood

Это создает C: \ FolderB, если он не существует, но создает C: \ FolderB \ FolderA, если C: \ FolderB существует. Если вы выполните эту команду дважды, вы можете получить две копии всего в немного разных местах! Так много боли.
Ламарт
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.