Linux端末を想定して書かれた手順書をもとにWindowsマシンで作業していたときにちょっと困ったのでメモ。
何度もやる作業じゃないから、2回mkdir
コマンドを実行すればよかったのだけれど、せっかくなのでワンライナーでがんばってみた。
[bashならできるのに]
実行したいコマンドのイメージは下記。mkdir -p p/{c1,c2}
でp
という親階層と、その下にそれぞれc1
、c2
というサブディレクトリを作成したい。
$ 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というコマンドのエイリアスになっているらしい。
ドキュメントを読んでみたが、複数のサブディレクトリを作成する直接的な方法については記載が見当たらない。
[PowerShellではこうやる]
公式ドキュメントでは回答が得られなかったので、「PowerShell array parameter mkdir」でGoogle検索すると以下のStackOverflowがひっかかった。
> "a","b","c","d" | % { mkdir "a\b\c\d\$_" }
または
> echo a,b,c,d | % { mkdir "a\b\c\d\$_" }
のように、パイプと%記号(ForEach-Object
コマンドのエイリアス)を組み合わせれば目的を達成できそうだ。
というわけで試してみる。
> "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のワンライナーで作成することができた。
[まとめ]
- PowerShellの
mkdir
コマンドはNew-Item
コマンドのエイリアスである - 配列と
ForEach-Object
コマンド(または%コマンド)をパイプで組み合わせると異なるパラメータで同じコマンドを複数回実行できる