PowerShellで、階層コピー
階層情報を保持したまま、単一ファイルをコピーする。
いろんなサイトでやっている、PowerShellによる階層コピーにチャレンジしてみた。これができれば、結構いろんなことができる。車輪の再発明。
実行前
このような状態からtest1の中にある3.txtだけを、階層を保ったまま、test2コピーするのが目標。 結果、test2\hoge\hogehoge\hogehogehoge\3.txtを作りたい。 higehigeやhagehagehageは作らない。
E:\ ├─test1 │ └─hoge │ ├─higehige │ └─hogehoge │ ├─hagehagehage │ │ 9.txt │ │ │ └─hogehogehoge │ 1.txt │ 2.txt │ 3.txt │ 4.txt │ └─test2
想定結果
この様な形になって欲しい。
E:\ ├─test1 │ └─hoge │ ├─higehige │ └─hogehoge │ ├─hagehagehage │ │ 9.txt │ │ │ └─hogehogehoge │ 1.txt │ 2.txt │ 3.txt │ 4.txt │ └─test2 └─hoge └─hogehoge └─hogehogehoge 3.txt
実行スクリプト
というわけでスクリプトを書いてみた。
$src_dir = 'E:\test1' $dest_dir = 'E:\test2' $src_file = '\hoge\hogehoge\hogehogehoge\3.txt' #パスを結合する。 $src = Join-Path $src_dir $src_file $dest = Join-Path $dest_dir $src_file echo "コピー元:$src" #対象がファイルであれば処理を実行する。 if(Test-Path $src -PathType Leaf){ #転送先の親ディレクトリパスを取得 $dir = Split-Path $dest -Parent echo "コピー先:$dir" #ディレクトリが無ければ作成する。 if(!(Test-Path $dir -PathType Container)){ #何階層だろうと一気に作れるみたい。 New-Item $dir -itemType Directory } echo "ファイルをコピーします。:$src ==> $dir" #ファイルが既にあっても上書きコピー Copy-Item $src $dir -Force }
「New-Item ~ -itemType Directory」で、深い階層まで一気に作れるのがわかったで助かった。最初はパスを分解して一つずつフォルダを作るつもりだったので。
2022-06-18追記 指定するパスはシングルクォートで。でないと$以降が消えたりとかあるので。