PowerShellでフォルダを大量に複製する方法を備忘録として記録します。
大元のフォルダを複製していくので、複製されたフォルダは連番で付番されていきます。検証用のデータを作成するときなんかに使う想定です。まーwhileで回しているだけなんですが。。。
テスト用のダミーファイルを作成する方法はこちらに記載しています。以下のページで説明している方法でダミーファイルを作成し、それを保存したフォルダをこのページで説明している方法で複製するようなイメージで見てもらえると意図が伝わるかなーと思います。
-
【PowerShell】サイズを指定してテスト用ファイルを大量に作成する
PowerShellでテスト用のダミーファイルを大量に作成する方法を記録しておきます。 (突っ込まれるまえに言っておく)ネタとしては既出ではあるのですが、、、スクリプトにしたので流用できるように残して ...
PowerShellでフォルダを大量に複製する
まずは、簡易版というか、使う際にスクリプト内のフォルダ名などを修正して使うタイプです。
まーwhileで回しているだけn(ry ・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$base_dir = Split-Path $myInvocation.MyCommand.path $target_dir = "dir" $target_count = "10" $src_dir = "$base_dir\$target_dir" $Count=1 while ($True) { if ($Count -gt $target_count) { break } $num = $Count.ToString("000") $rep_dir="$base_dir\${target_dir}_$num" Copy-Item $src_dir $rep_dir -Recurse -Force $Count++ } |
以下の2点を修正して、スクリプトを複製元のフォルダと同じフォルダに保存して実行すると、同じフォルダに複製されます。
変数 | 値 |
$target_dir | 複製するフォルダ名(フルパスではない) |
$target_count | 複製する数(いくつ複製するか) |
以下が実行結果です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
PS D:\test\parent_dir> .\replica_dir.ps1 PS D:\test\parent_dir> ls Directory: D:\test\parent_dir Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2022/02/13 17:54 dir # 複製元フォルダ d---- 2022/02/13 21:00 dir_001 d---- 2022/02/13 21:00 dir_002 d---- 2022/02/13 21:00 dir_003 d---- 2022/02/13 21:00 dir_004 d---- 2022/02/13 21:00 dir_005 d---- 2022/02/13 21:00 dir_006 d---- 2022/02/13 21:00 dir_007 d---- 2022/02/13 21:00 dir_008 d---- 2022/02/13 21:00 dir_009 d---- 2022/02/13 21:00 dir_010 -a--- 2022/02/13 20:53 398 replica_dir.ps1 # スクリプトファイル |
もうひとつ、複製元/先のフォルダや数などをスクリプト実行時に引数で渡すバージョンです。まーwhileで回しているだけn(ry ・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# スクリプトファイルフォルダ/ファイル名取得 $base_dir = Split-Path $myInvocation.MyCommand.path $script_file = $MyInvocation.MyCommand.Name # 対象指定(フォルダパス/フォルダ数) $src_dir = $Args[0] $target_dir = $Args[1] $target_count = $Args[2] # 引数チェック(引数が3個以外ならexit) if ($Args.length -ne 3) { Write-Output "Error : 引数に複製元フォルダパス/複製先フォルダパス/複製するフォルダ数を指定してください。" Write-Output "Usage : .\$script_file D:\test\data\dir D:\test\parent_dir num" exit } # 複製するフォルダ名取得 $dir_name = Split-Path $src_dir -Leaf $Count=1 while ($True) { if ($Count -gt $target_count) { break } $num = $Count.ToString("000") $rep_dir="$target_dir\${dir_name}_$num" Copy-Item $src_dir $rep_dir -Recurse -Force $Count++ } |
以下の3点を修正して、実行します。実行フォルダは問わない。
変数 | 値 |
$src_dir | 複製元のフォルダパス |
$target_dir | 複製先のフォルダパス(複製されたフォルダが保存される親となるフォルダ) |
$target_count | 複数する数(いくつ複製するか) |
実行結果は以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
### 複製元のフォルダ > ls D:\test\data Directory: D:\test\data Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2022/02/13 17:54 dir ### 実行 > D:\test\tool\replica_dir.ps1 D:\test\data\dir D:\test\parent_dir 5 ### 結果(複製先のフォルダ) > ls D:\test\parent_dir Directory: D:\test\parent_dir Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 2022/02/13 21:10 dir_001 d---- 2022/02/13 21:10 dir_002 d---- 2022/02/13 21:10 dir_003 d---- 2022/02/13 21:10 dir_004 d---- 2022/02/13 21:10 dir_005 |
以上です。