はじめに
PowerShellの練習がてら、ちょっと複雑なフォルダ階層を作る関数を実装してみました。
現時点ではとりあえずの備忘録です。暇があればもっと汎用的に使えるよう書き直したいところ。
folder
├─fuga
│ ├─No.1
│ ├─No.2
│ └─No.3
├─hoge
│ ├─No.1
│ ├─No.2
│ └─No.3
└─piyo
├─No.1
│ ├─bar
│ ├─baz
│ └─foo
├─No.2
│ ├─bar
│ ├─baz
│ └─foo
└─No.3
├─bar
├─baz
└─foo
第一階層:folder。一番大きなディレクトリ。
第二階層:hoge/fuga/piyo。ここは固定で作成します。
第三階層:No.1~No.x。キー入力を受け取り、任意の数だけ作成します。
第四階層:foo/bar/baz。piyoディレクトリの下にだけ、さらに深い階層を作成します。
サンプルコード
function makeFolders {
("hoge","fuga","piyo") | new-item -path "./folder" -itemtype directory -name {$_} -force
1..$n | new-item -path "./folder/*" -itemtype directory -name {"No." + $_} -force
("foo","bar","baz") | new-item -path "./folder/piyo/*" -itemtype directory -name {$_} -force
}
# キー入力で任意の数字を受けとる
$n = read-host "フォルダを作りたい個数を入力してください"
# フォルダを作る
makeFolders | out-null
# 実行結果を出力
write-host "`n下の通りフォルダを作りました`n"
tree "./folder"
ポイント
function
当たり前すぎてどこにも書いてないレベルですが、関数は使う場所より上に定義する必要があります。
もっとレベルの高い説明は こちら
-force オプション
new-item のオプションに -force
を指定しています。
この記述があることにより、既にフォルダがある場所に同名のフォルダを作成した場合に、上書きされる(=エラーにならない)ようになります。
今回の例くらいなら特に気にする必要はありませんが、消えたら困るデータがある場合は注意して使ったほうが良いかも?
out-null
関数の内部にある new-item
などを実行するといろいろコンソールに表示されますが、邪魔なので表示しないようにしています。
引数を渡しているわけでもないのに処理を関数に切り出しているのも、この非表示にしたい意図があるためだったりします。
詳しくは こちら
エスケープ文字
多くのプログラミング言語では \
(バックスラッシュ)でエスケープすることが多い印象ですが、PowerShellでは ` (バッククオート)を使います。
詳しくは こちら
参考
New-Item
PowerShellでNew-Itemの出力結果を表示させない方法
PowerShellのエスケープシーケンス