Что означает аргумент -container для Powershell Copy-Item? - PullRequest
32 голосов
/ 24 сентября 2008

Я пишу скрипт для MS PowerShell. Этот скрипт использует команду Copy-Item. Одним из необязательных аргументов этой команды является "-container". В документации этого аргумента указано, что указание этого аргумента «Сохраняет объекты-контейнеры во время операции копирования».

Это все хорошо, потому что я был бы последним человеком, который захочет сохранить объекты-контейнеры во время операции копирования. Но со всей серьезностью, что делает этот аргумент? В частности, в случае, когда я копирую дерево каталогов дисков из одного места в другое, как это влияет на поведение команды Copy-Item?

Ответы [ 2 ]

57 голосов
/ 15 февраля 2014

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

Обратите внимание, что -Container означает -Container: $true.

Это структура файла, которую я использовал для примеров:

#    X:.
#    ├───destination
#    └───source
#        │   source.1.txt
#        │   source.2.txt
#        │
#        └───source.1
#                source.1.1.txt
  • Для всех примеров текущее местоположение (pwd) X:\.
  • Я использовал PowerShell 4.0.

1) Чтобы скопировать только исходную папку (пустую папку):

Copy-Item -Path source -Destination .\destination
Copy-Item -Path source -Destination .\destination -Container
#    X:.
#    ├───destination
#    │   └───source
#    └───source (...)

Ошибка выдает следующее:

Copy-Item -Path source -Destination .\destination -Container: $false
# Exception: Container cannot be copied to another container. 
#            The -Recurse or -Container parameter is not specified.     

2) Чтобы скопировать всю структуру папок с файлами:

Copy-Item -Path source -Destination .\destination -Recurse
Copy-Item -Path source -Destination .\destination -Recurse -Container
#    X:.
#    ├───destination
#    │   └───source
#    │       │   source.1.txt
#    │       │   source.2.txt
#    │       │
#    │       └───source.1
#    │               source.1.1.txt
#    └───source (...)    

3) Чтобы скопировать всех потомков (файлы и папки) в одну папку:

Copy-Item -Path source -Destination .\destination -Recurse -Container: $false
#    X:.
#    ├───destination
#    │   │   source.1.1.txt
#    │   │   source.1.txt
#    │   │   source.2.txt
#    │   │
#    │   └───source.1
#    └───source (...)
27 голосов
/ 24 сентября 2008

Контейнер, о котором идет речь, - это структура папок. Если вы делаете рекурсивное копирование и хотите сохранить структуру папок, вы должны использовать ключ -container. (Примечание: по умолчанию для параметра -container установлено значение true, поэтому вам не нужно его указывать. Если вы хотите отключить его, вы можете использовать -container: $false.)

В этом есть одна загвоздка ... если вы создадите список каталогов и передадите его в Copy-Item, он не сохранит структуру папок. Если вы хотите сохранить структуру папок, вы должны указать свойство -path и ключ -recurse.

...