What is the meaning of Powershell's Copy-Item's -container argument? What is the meaning of Powershell's Copy-Item's -container argument? powershell powershell

What is the meaning of Powershell's Copy-Item's -container argument?


I too found the documentation less than helpful. I did some tests to see how the -Container parameter works in conjunction with -Recurse when copying files and folders.

Note that -Container means -Container: $true.

This is the file structure I used for the examples:

#    X:.#    ├───destination#    └───source#        │   source.1.txt#        │   source.2.txt# #        └───source.1#                source.1.1.txt
  • For all examples, the current location (pwd) is X:\.
  • I used PowerShell 4.0.

1) To copy just the source folder (empty folder):

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

The following gives an error:

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) To copy the whole folder structure with files:

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

3) To copy all descendants (files and folders) into a single folder:

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


The container the documentation is talking about is the folder structure. If you are doing a recursive copy and want to preserve the folder structure, you would use the -container switch. (Note: by default the -container switch is set to true, so you really would not need to specify it. If you wanted to turn it off you could use -container: $false.)

There is a catch to this... if you do a directory listing and pipe it to Copy-Item, it will not preserve the folder structure. If you want to preserve the folder structure, you have to specify the -path property and the -recurse switch.