前回は、PowerShellのスクリプトを書いていく上で最初のテンプレートとも言える部分の説明を行った。Windows、Mac、Linuxのすべてにおいて使用できるPowerShellスクリプトの書き方だ。成果物は次の通りである。

#!/usr/bin/env pwsh

これだけかと思うかもしれないが、こうやって一つ一つ理解して解決していくことが大切だ。地道に続けることで、いずれはスラスラとPowerShellスクリプトを書けるようになる。

スクリプトの勉強は実際のコードで進める

スクリプトの学習方法はいくつかある。本連載の初期は、できるだけPowerShellの仕様に沿うかたちでPowerShellの機能を取り上げてきたつもりだ。初めてプログラミング言語の学習に取り掛かるときはそれでよいかと思うが、ある程度できるようになったら、次は実際のスクリプトやスニペットなどから学習を進めたほうが理解が深まるだろう。

そこでしばらくは、Microsoftが公開するブログ「PowerShell Community Blog」の内容をピックアップするかたちで学習を進めていこうと考えている。

PowerShell Community


上記は2021年2月から始まった新しい試みで、Microsoftの説明によれば「This is a blog by the community and for the community. And we have made it easier than ever for you to contribute to the new blog. (筆者意訳:これはコミュニティのによるコミュニティのためのブログです。この新しいブログに寄稿する方法もこれまでにないくらい簡単になりました)」ということになる。

Microsoftはもともと「Scripting Blog | A place to learn about PowerShell and share stories of automation」で16年間に渡って同社のスクリプト技術に関する記事を掲載してきた。最初はVBScriptとWindowsバッチファイルに焦点を当てたブログだったが、2008年ごろからPowerShellの記事が掲載されるようになり、総記事数は5400を超えるまでに成長したものの、ここ3、4年は停滞していた。上記コミュニティブログはこれに代わる新しいブログということだ。実際、Scripting BlogはPowerShell Community Blogの登場と共に、正式に終了している。

2021年2月21日に最初の投稿が行われ、2021年4月2日に11本目の記事が追加されている。約1カ月半で10本程度が投稿された計算だ。これを多いと見るか少ないと見るかは別として、このブログでフレッシュな情報を定期的に入手できる状態になる(と、Microsoftは期待している)のは喜ばしいことだろう。本連載でも、このブログに掲載されるトピックから興味深いものを取り上げ、PowerShellスクリプトを勉強していく際のネタとして使うことにしよう。

もちろん、このまま投稿が増えることなく静かに消えてしまう可能性も否めない。だが、今のところ公式にPowerShellの情報が手に入る場所としてはそこそこ有望だ。しばらくウォッチを続けていこう。

試しにシェルスクリプトを作ってみる

最初のネタとして、次の記事を選んでみた。

Determine if a folder exists | PowerShell Community


上記の投稿は「フォルダーが存在するかどうか知る方法はありますか」という質問に対して、「方法はいくつもある。例えば、Test-Pathコマンドレットを使う方法がある」と回答されているものだ。内容としては、シンプルでわかりやすい。具体的には、次のサンプルコードが掲載されており、これがすべてを物語っている。

$Folder = 'C:\Windows'
"Test to see if folder [$Folder]  exists"
if (Test-Path -Path $Folder) {
    "Path exists!"
} else {
    "Path doesn't exist."
}

上記サンプルを一言で表すと、「『Test-Path フォルダパス』というコマンドレットの使い方を説明している」ということになる。「Test-Path フォルダパス」は指定したフォルダが存在していれば「True」を返し、存在していなければ「False」を返す。

では、これを使ってスクリプトを作ってみよう。投稿内でも説明されているが、上記サンプルの処理はMacやLinuxで使われるtestコマンドに-dオプションを指定したときの動作に似ている。このため、「test-d.ps1」というファイル名で次のようなスクリプトを書いてみる。

#!/usr/bin/env pwsh

Test-Path -Path $args[0]

これで引数に指定したパスが存在するかどうかを調べ、「True」または「False」を返すというスクリプトになっている。実行すると次のようになる。

「test-d.ps1」の実行サンプル

動作していることが確認できた。

シンプルなサンプルから機能を広げながら学ぶ

上記サンプルを見るとわかるが、上記サンプルではパスとしてフォルダパスではなくファイルパスを与えた場合も、「True」と判断されている。対象が「存在しているかどうか」だけをチェックしているので、それがファイルなのかフォルダなのかという判定は行っていないのだ。

また、引数に何も指定されなかった場合の処理も行っていない。大抵使い方を忘れるものなので、何も指定せずに実行したときには使い方を出力するようにしておくと便利だ。

このように、簡単なスクリプトからも学びを広げていくことができる。こうして一つ一つ学んでいくことで、そこそこ使えるスクリプトが仕上がっていくし、スクリプトを作成するときの定型パターンのようなものも身に付くはずだ。今後は、この要領でPowerShellスクリプトを書いていく方法を整理していこうと思う。

参考