スクリプトファイルとは

今回はスクリプトファイルを作ってみます。Windows PowerShellのプログラムをテキストファイルに作成し、それをコマンドレットのように実行できるようにします。コマンドプロンプトで言うバッチファイル(バッチコマンド)に相当するもので、コマンドプロンプトでは拡張子が.batになりますが、PowerShellのスクリプトは拡張子が.ps1になります。

一方、バッチファイルは特別な準備なく実行できますが、PowerShellでは、スクリプトの実行を許可するための環境設定が必要です。マルウェア等の不正プログラムの実行を防止するためです。

スクリプトファイルの作成と実行ポリシーの設定

スクリプトの中身は、PowerShellプロンプトで入力する内容と同じです。ためしに、test.ps1を作成してみましょう。たとえば、メモ帳を起動して、以下のように入力します。

Get-Date
Get-Host

メモ帳で簡単なプログラムを作成。今日のシステム日付と、システム情報を出力するプログラムです。

これを、ドキュメントなどの適当なフォルダに test.ps1 というファイル名で保存します。

ドキュメントフォルダにtest.ps1を保存。

コマンドプロンプトであれば、このままプロンプトからtestと入力すれば実行できそうですが、PowerShellではそうはいきません。

test.ps1を実行しようとしてもエラーになります。

PowerShellの既定値ではスクリプトの実行を禁止しています。Set-ExecutionPolicyコマンドレットでスクリプトの実行ポリシーの設定を変更し、実行を許可する必要があります。Set-ExecutionPlicyに設定するパラメータは以下の通りです。

パラメータ 動作
Restricted すべてのスクリプトの実行を禁止(既定値)
AllSigned 署名されたスクリプトのみ実行を許可
RemoteSigned ダウンロードしたスクリプトの実行には署名が必要。自分で作成したスクリプトは署名無しでも実行。
Unrestricted すべての実行を許可。ダウンロードしたスクリプトの実行には警告を表示。
Bypass 無条件ですべての実行を許可。警告無し。(PowerShell v.2のみ
Undefined 現在割り当てている実行ポリシーを削除(グループポリシーには影響なし)

※ BypassとUndefinedパラメータは、PowerShell 2.0(Windows Server 2008 R2とWindows 7)で使用できます。

一般的にはRemoteSignedにするといいでしょう。

実行ポリシーをRemoteSignedに変更。設定値はGet-ExecutionPolicyで確認できます。

※Set-ExecutionPolicyはレジストリを変更するため、ユーザーアカウントの権限によっては実行ポリシーを変更できません。そのときは、PowerShellを「管理者として実行」で起動して操作します。

Windows 7での「管理者として実行」でPowerShellを起動する例。

スクリプトと実行パス

PowerShellスクリプトを実行するには、実行ポリシーを設定した上で、スクリプトを保存したパスに注意が必要です。実行するスクリプトファイルを環境変数PATHで設定したディレクトリに保存するか、または、実行時にパス付きでプロンプトに入力します。

例えば、C:\psscriptというディレクトリにtest.ps1というスクリプトファイルを保存した場合、以下のようになります。

(1)環境変数PATHにC:\psscriptが登録されているとき
 testと入力するだけで実行。

(2)環境変数PATHにC:\psscriptが登録されていないとき
 C:\psscript\test 等、パスも入力しなければ実行できません。

これは、C:\psscriptをカレントディレクトリにしたときも同様です。コマンドプロンプトと違い、PowerShellではカレントディレクトリを検索しません。C:\psscriptがカレントディレクトリでも、C:\psscript\test、あるいはカレントディレクトリを意味する.\をつけて、.\test と実行しなければなりません。

カレントディレクトリにtest.ps1があるとき、testと実行しても実行できません。.\testとすると実行できます。

※ 環境変数PATHに「.\」を追加しておけば、いちいち「.\」をファイル名につけなくてもカレントディレクトリのスクリプトを実行できるようになります。

※ PowerShell 2.0を装備しているWindows 7では、スクリプトファイルのショートカットメニュー「PowerShellで実行」で実行することもできます。

PowerShellスクリプトファイルのショートカットメニュー。

スクリプトでパラメータを使う

PowerShellプロンプトでスクリプトを実行するとき、PowerShell関数の引数($args)と同じで、$args[0]、$args[1]、$args[2]...としてコマンドラインのパラメータを使用できます。コマンドプロンプトの%1、%2...変数と同様です。

たとえば、2つの数値をパラメータに指定して、1つめの数から2つめの数までの和を求めて表示するコマンドsigmaは、メモ帳で以下のようにsigma.ps1を作成します。

$sum = 0
for ($i = $args[0]; $i -le  $args[1]; $i++ )
{
    $sum += $i
}
return $sum

メモ帳でsigma.ps1を作成。

スクリプトのコマンドは、それが1つの関数定義だと思うとわかりやすいでしょう。たとえば、function sigma { }の{ }内に上記のプログラムを記述すれば、そのままsigmaという関数を作成できます。

スクリプトsigmaで、1から10、1から100、500から1000の合計を計算。

forは繰り返し構文と呼ばれるプログラム構造で、一定の条件を満たす間、処理を繰り返します。通常はインデックスまたはカウンタと呼ぶ変数を使って、変数を更新しながら繰り返し処理を行います。

for (インデックス初期設定; 繰り返し条件; インデックス更新) { 繰り返し処理 }

前述のプログラムを解説します。

1行目> 合計値を格納する$sum変数を0にします。(前処理)

2行目> 繰り返し構文forで、インデックス変数には$iを使います。$iには最初の$args[0](最初のパラメータ)を初期値として代入します。-leは「~以下」を意味しますので、$iが$args[1](2つめのパラメータ)以下である間、繰り返し処理をします。++は、整数の変数に1を加えます(同様に、整数から1を減じる「--」もあります)。つまり、$iを、繰り返すたびに増加させます。

3行目~5行目> $sumの値に$iを加えて、$sumの値を更新します。「$sum = $sum + $i」という記述の省略形です。

6行目> $sumの値...合計値を返します。

なお、このプログラムは、確実に開始値と終了値の2つのパラメータを指定し、開始値の方が終了値より小さいことを前提としています。より完璧なプログラムを作成するためには、開始値や終了値が正しく指定されなければエラーを表示するようなエラー処理も必要になります。

※ PowerShell 1.0では、上述のようにメモ帳などのテキストエディタを使用してスクリプトを開発しかありませんが、Windows Server 2008 R2やWindows 7では、PowerShell ISEという専用開発環境を使用して、スクリプトの設計、デバッグ(実行試験と修正)をできます。

Windows PowerShell ISE。スクリプトファイル編集、プロンプトからの実行、実行結果の確認の3つのウインドウがあります。