MSPowerShell用のスクリプトを書いています。このスクリプトは、Copy-Item
コマンドを使用します。このコマンドのオプションの引数の1つは、「-container
」です。引数のドキュメントには、この引数を指定すると「コピー操作中にコンテナオブジェクトが保持される」と記載されています。
コピー操作中に保存されていないコンテナオブジェクトが必要になるのは私が最後になるため、これはすべてうまくいきます。しかし、すべての深刻さにおいて、この議論は何をしますか?特に、ディスクディレクトリツリーをある場所から別の場所にコピーする場合、これはCopy-Item
コマンドの動作にどのような違いをもたらしますか?
ドキュメントが話しているコンテナはフォルダ構造です。再帰コピーを実行していて、フォルダー構造を保持したい場合は、-containerスイッチを使用します。 (注:デフォルトでは、-containerスイッチはtrueに設定されているため、実際に指定する必要はありません。オフにする場合は、-container: $false
を使用できます。)
これには落とし穴があります...ディレクトリリストを作成してCopy-Itemにパイプすると、フォルダ構造は保持されません。フォルダ構造を保持したい場合は、-pathプロパティと-recurseスイッチを指定する必要があります。
私もドキュメントが役に立たなかったと思いました。ファイルやフォルダーをコピーするときに、-Container
パラメーターが-Recurse
とどのように連携するかを確認するためにいくつかのテストを行いました。
-Container
は-Container: $true
を意味することに注意してください。
これは、例で使用したファイル構造です。
# X:.
# ├───destination
# └───source
# │ source.1.txt
# │ source.2.txt
# │
# └───source.1
# source.1.1.txt
X:\
です。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 (...)