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追記 指定するパスはシングルクォートで。でないと$以降が消えたりとかあるので。