PowerShellはマイクロソフトが開発したシェルであり、コマンドラインインターフェイス(CUI)を備えたスクリプト言語です。Windows 7以降のOSに標準で搭載されています。Windows標準と言うとmacOSやLinuxとは無関係の気もしますが、マルチプラットフォーム対応でmacOSやLinuxでも動かすことができます。今回は、便利で多機能なPowerShellについて紹介します。
PowerShellの歴史
Windowsでは長らくMS-DOSとの互換性を持たせたコマンドラインシェルである「コマンドプロンプト」が使われてきました。もちろん、最新のWindows10でもコマンドプロンプトが利用できます。しかし、MS-DOSは1980年に開発されたOSです。40年もの昔に開発されたツールが今でもほとんど形を変えず利用できるWindowsは本当に互換性が大切にされていて素直にスゴイと感心します。しかし、互換性と引き換えに革新的な機能が追加されることなく、その機能不足は否めないものとなっていました。
そこで、マイクロソフトは1998年にWindows 98のために、コマンドプロンプトを補うためにWSHの機能を提供しました。これは、VBScriptやJScriptなどのスクリプト言語を通して、Windowsを操作するものでした。ところが、WSHを利用したウィルスが多く出回ったこともあり、それほど普及しませんでした。そこで、2003年に開発されたのがPowerShellです。その後、バージョンアップが行われ、Windows 7以降のWindowsに標準搭載されました。そして、2016年にPowerShellはオープンソース化されて、2018年にはLinuxやmacOSに移植が行われました。
PowerShellがオープンソース化され、マルチプラットフォームになったことですし、もし、まだコマンドプロンプトやバッチファイルに頼ることが多いという方は、この機会にPowerShellに触れてみると良いでしょう。
PowerShellで出来ること
PowerShellはコマンドプロンプトの後継となるものであり、コマンドプロンプトのように、プログラムを実行したりファイル処理を行ったり、バッチ処理を記述できます。また、Windowsを制御したり、いろいろなアプリケーションを操作できます。また、コマンドプロンプトに比べて、スクリプト言語としての機能が大幅に強化されています。また、WSHで問題となったセキュリティに関しても、安全に実行が出来るよう配慮されています。
それで、WindowsのCOMオブジェクトに対応したアプリケーションであれば、手軽にその機能を利用できるのも特徴です。例えば、ExcelやWordなどOfficeアプリケーションはCOMに対応しているため、Excelを遠隔操作するという用途にも利用できます。マウスでコツコツやっていた作業も自動化できる可能性があります。
また、Windowsのアプリケーションの実行環境である.NET Frameworkの機能に直接アクセスすることができます。そのためWindowsに用意されている様々なAPIを利用してプログラムを作成することができます。
簡単なプログラム
PowerShellでは最初から多くの組み込みコマンドが備わっています。Windows 10のPowerShell ISEを利用すると、画面右側にコマンドの一覧が表示され、そこから任意のコマンドを選ぶことができるようになっています。なお、PowerShellのコマンドは「Set-Location」のように「(動詞)-(名詞)」という命名規則を採用しています。
ちなみに、PowerShell ISEでは「Set-」と入力すると、それに続く「Set-Alias」や「Set-Clipboard」、「Set-Location」などの入力補完が自動的に表示され、そこから選ぶことができます。また、タブキーを押すとコマンドの続きが自動的に表示されます。
それでは、簡単なプログラムを作ってみましょう。ここでは、例として、日付を画面に出力するプログラムを対話的に実行してみましょう。WindowsでPowerShellは標準でインストールされているので、別途何かをインストールする必要ありません。Windows上でPowerShellを実行してみましょう。スタートメニューより「Windows PowerShell > Windows PowerShell ISE」を選んでクリックするとPowerShellを起動できます。
以下のコマンドを入力して結果を確認してみましょう。以下は画面にその日の日付を表示します。
$today = Get-Date
$today.ToString("yyyy/MM/dd")
PowerShellに打ち込んでみると、次のように結果が表示されます。
FizzBuzzを作ってみよう
それでは、PowerShellでFizzBuzzのプログラムを作ってみましょう。これは本連載でいつも作っているものですが、FizzBuzz問題とは以下のようなものです。
1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
以下を「fizzbuzz.ps1」という名前で保存します。
# FizzBuzzの値を得る --- (*1)
Function Get-FizzBuzz($n) {
$IsFizz = (($n % 3) -eq 0) # Fizzか判定 --- (*2)
$IsBuzz = (($n % 5) -eq 0) # Buzzか判定
if ($IsFizz -and $IsBuzz) {
return "FizzBuzz"
} elseif ($IsFizz) {
return "Fizz"
} elseif ($IsBuzz) {
return "Buzz"
}
return $n
}
# 1から100までGet-FizzBuzzを実行 --- (*3)
@(1..100) | foreach {
Get-FizzBuzz $_ | Write-Host
}
プログラムを実行するには、以下のコマンドを実行します。
PowerShell -ExecutionPolicy RemoteSigned .\fizzbuzz.ps1
正しくプログラムが実行されると、以下のように1から100までのFizzBuzzの値が表示されます。
プログラムを確認してみましょう。(*1)の部分では、Get-FizzBuzz関数を定義します。(*2)以下の部分では引数$nを3で値を割った余りが0になればFizz、5で割った余りが0になればBuzzと値を判定します。値が等しいかどうか調べるのが「-eq」、AかつBの論理演算を調べるのが「-and」です。そして、if文で条件判定を行います。
興味深いのが(*3)の部分です。ここでは、1から100までの値を繰り返し実行して、Get-FizzBuzz関数を実行しその結果を出力します。記号「@」で配列を表し、記号「|」(縦棒)がパイプを表します。つまり、配列の値をパイプでforeachに伝えているのです。foreachは与えた値の数だけ直後にある{ .. }の内側を繰り返す構文です。ここでも、パイプを利用して、Get-FizzBuzzの結果をWrite-Hostに与えることを意味しています。Write-Hostは標準出力に値を出力するコマンドです。
まとめ
以上、ここまでの部分でPowerShellについて簡単なプログラムと共に紹介しました。PowerShellはWindowsに標準で搭載されていて、インストールの必要もありません。Windowsや.NET Frameworkの機能に直接アクセスできるのも良いところです。既にさまざまな自動化に役立っているPowerShellです。いろいろなOSでも利用できるようになり、今後はより幅広く使われていくことでしょう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。