kdnakt blog

hello there.

PowerShellで複数のサブディレクトリを一発で作成する

Linux端末を想定して書かれた手順書をもとにWindowsマシンで作業していたときにちょっと困ったのでメモ。

何度もやる作業じゃないから、2回mkdirコマンドを実行すればよかったのだけれど、せっかくなのでワンライナーでがんばってみた。

 

 

[bashならできるのに]

実行したいコマンドのイメージは下記。mkdir -p p/{c1,c2}pという親階層と、その下にそれぞれc1c2というサブディレクトリを作成したい。

$ mkdir work
$ cd work
$ tree
.

0 directories, 0 files
$ mkdir -p p/{c1,c2}
$ tree              
.
└── p
    ├── c1
    └── c2

3 directories, 0 files

 

しかし、PowerShellで同じコマンドを実行したところ、次のようなエラーが発生した。

> mkdir -p p/{c1,c2}
At line:1 char:15
+ mkdir -p p/{c1,c2}
+               ~
Missing argument in parameter list.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingArgument

 

ちなみに、PowerShellのバージョンは6.2.3を利用している。

> $HOST
Name             : ConsoleHost
Version          : 6.2.3
InstanceId       : 28541119-0da6-429b-9210-b4d6d9a67354
UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture   : ja-JP
CurrentUICulture : ja-JP
PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
DebuggerEnabled  : True
IsRunspacePushed : False
Runspace         : System.Management.Automation.Runspaces.LocalRunspace

 

PowerShellではmkdirコマンドはNew-Itemというコマンドのエイリアスになっているらしい。

ドキュメントを読んでみたが、複数のサブディレクトリを作成する直接的な方法については記載が見当たらない。

docs.microsoft.com

 

[PowerShellではこうやる]

公式ドキュメントでは回答が得られなかったので、「PowerShell array parameter mkdir」でGoogle検索すると以下のStackOverflowがひっかかった。

stackoverflow.com

 

> "a","b","c","d" | % { mkdir "a\b\c\d\$_" }

または

> echo a,b,c,d | % { mkdir "a\b\c\d\$_" }

のように、パイプと%記号(ForEach-Objectコマンドのエイリアス)を組み合わせれば目的を達成できそうだ。

 

というわけで試してみる。

f:id:kidani_a:20200623232618p:plain

> "c1","c2" | % { mkdir -p p/$_ }
    Directory: C:\tmp\p
Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        2020/06/23    23:00                c1
d-----        2020/06/23    23:00                c2
> tree
フォルダー パスの一覧
ボリューム シリアル番号は XXXX-XXXX です
C:.
└─p
    ├─c1
    └─c2

 

無事に複数のサブディレクトリをPowerShellワンライナーで作成することができた。

 

[まとめ]

  • PowerShellmkdirコマンドはNew-Itemコマンドのエイリアスである
  • 配列とForEach-Objectコマンド(または%コマンド)をパイプで組み合わせると異なるパラメータで同じコマンドを複数回実行できる