PowerShell でフォルダーを一括作成する

経緯

先日同僚が、お客様からもらったリストを元に、約 5,000 個程のフォルダーを作成するという話をしていたので、PowerShell でサクッと試してみた

環境

  • Windows Pro 10
  • PowerShell 5.1.17134.228

用意したデータ

次の内容で list.txt として用意した

ルート
ルート/子1
ルート/子1/孫1-1
ルート/子1/孫1ー1/ひ孫1-1-1
ルート/子1/孫1ー1/ひ孫1-1-2
ルート/子1/孫1-2
ルート/子1/孫1-2/ひ孫1-2-1

ルート/子2
ルート/子2/半角 スペース
ルート/子2/全角 スペース
ルート/子2/重複テスト
ルート/子2/重複テスト
ルート/子2/hoge*異常系テスト
  • 1-7 行目まで「ルート/子1」の部分が正常系
  • 8 行目が空行テスト
  • 9 行目以降はデータの異常系テスト

コード

Get-Content list.txt | %{ &({ [void](New-Item ($_.ToString()) -ItemType Directory -Force)}, { Write-Output "is row empty" })[[string]::IsNullOrWhiteSpace($_.ToString())] }

何となく無理やりワンライナーで書いてみました

  1. list.txt を読み込み
  2. ForEach-Object(コードでは省略して % と表記)で行数分繰り返す
    • フォルダ作成処理
      • 空行ではない時行が空じゃないときにフォルダを作成
      • 空行の時「is row empty」と表記する

実行例

Get-Content list.txt | %{ &({ [void](New-Item ($_.ToString()) -ItemType Directory -Force)}, { })[[string]::IsNullOrWhiteSpace($_.ToString())] }

New-Item : パスに無効な文字が含まれています。
発生場所 行:1 文字:38
+ ...  &({ [void](New-Item ($_.ToString()) -ItemType Directory -Force)}, {  ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (C:\Users\hoge\...\子2\hoge*異常系テスト:String) [New-Item]、ArgumentException
    + FullyQualifiedErrorId : CreateDirectoryArgumentError,Microsoft.PowerShell.Commands.NewItemCommand

予定通り、異常系テストの最終行のファイルやフォルダ名で使えない文字でエラーが出た

考察

ちゃんと書けば try-catch-finally を入れるんだろうけど、とりあえずエラーが出た箇所の行を修正していけばよさそう