変数と数値

コマンドプロンプトでも環境変数という変数を使用できましたが、文字列を保存するだけで、コマンドラインやバッチコマンドレベルでは計算も加工もできない使い勝手の悪いものでした。Windows PowerShell(以下PowerShell)では、汎用プログラム言語のような変数を使用できます。

まずは試し、PowerShellのプロンプトに「$i = 123」と入力してEnterキーを押して実行して下さい。次に、「$i * 2」と入力して実行します。

$i*2で、$iに代入した数値を計算しています。

変数は処理対象となるデータを一時的に保存します。

変数名は$の後に任意の文字列をつけます。プログラム言語によっては変数を使用する前にどんな変数を使うのか「宣言」手続きが必要ですが、PowerShellでは、最初に変数に値を保存するときに自動的に作成しますので、宣言はありません。変数にデータを保存することを代入と呼びます。

一方、PowerShellでは数式の演算結果をすぐに表示します。2行目に$i * 2と実行しているのは、$iという変数の中身(つまり123という数値)を2倍にしています。

変数は、何度も使うデータを一時的に保存しておく、あるいは、状況によって値が変動するデータを使う定型処理(繰り返し処理)などに便利です。

※ PowerShellでは数値に単位を使えます。たとえば、1KBと入力すると1024、2MBと入力すれば2097152を意味します。

文字列変数

今度は、「$s="123"」と実行し、「$s*2」と実行して下さい。

$s*2で、$sに代入した文字列を計算(処理)しています。

PowerShellでは文字列を指定する時にダブルクォーテーションまたはシングルクォーテーションで囲みます。文字列"123"を代入したことで、$sは文字列型の変数となりました。文字列型の場合、「123」を数値ではなく「1」と「2」と「3」という文字の並びとしてとらえ、「*」は同じ文字列を指定回数繰り返します。

文字列型と数値型の変換

異なる型である文字列型と数値型を変換したいときは、キャスト(型変換)を使います。

たとえば、文字列型の変数 $s の値を数値に変換して使いたい時、キャスト[整数型](Int)あるいは[実数型](Double)を使います。

文字列変数$sのテスト。「$s * 2」では、文字列として処理しています。しかし次の行では、「[int]$s」で$sを整数型に変換した上で「* 2」を実行しているので、数値として計算しています。

同様に、数値の変数$iの数値を文字列にしたい時、[String]を使います。

「$i * 2」では数値として計算していますが、「[String]$i * 2」では文字列として処理しています。

なお、数値を文字列に変換して使用する時は、数値型オブジェクトのメンバ関数(メソッド)であるToString()もよく使います。たとえば、「$i.ToString()」は$iを文字列化した値を意味します。また、変数の型が分からない時は、メンバ関数GetType()を使います。

$iと$sでGetType()を使った画面。変数が何型かすぐに分かります。

変数一覧

前述の例ではinteger(整数)やstring(文字列)の略で$i、$sという変数名を使用しましたが、基本的に変数名の$の後は任意の名前でかまいません。ただし、あらかじめシステムが利用している既定の変数名は使用できません。また、存在する変数はVariableコマンドで一覧表示できます。

Variableコマンドを実行した画面。左側が変数名、右側が保存されている値。

変数の確認と消去

ある変数が存在していることを確認するには、Test-Pathコマンドレットを使用します。たとえば、$sが存在するかどうか確認するは「Test-Path Variable:s」と実行します。存在すればTrue(真)、存在しなければFalse(偽)を返します。このとき、変数を意味する「$」は不要です。また、不要になった変数$sを明示的に削除する時はRemove-Itemコマンドレットを使い、「Remove-Item Variable:s」と実行します。

Test-Pathコマンドレットで変数$sを確認し、Rmove-Itemコマンドレットで削除。

※ コマンドプロンプトに変数名を直接入力しても、その変数が存在するかどうかは不明です。存在しない変数の場合、$null(何もないことを意味する値)を表示しますので、存在する変数の値が$nullなのか、変数そのものが存在しないのか判別できません。

0から100まで加える

ここでちょっとプログラミングらしいことをやってみましょう。

以下のプログラムをコマンドラインに入力して下さい。コマンドプロンプトと異なり、PowerShellのプロンプトは一連の入力が終わるまで、複数行の入力が可能です。

$sum = $i = 0
while ( $i -le 100 )
{
    $sum += $i
    $i++
}
$sum

0から100まで加えるプログラム。

※ 複数行にまたがった時は、最後に空行を入力したところで終了。

たかが1から100まで加えるだけ...と馬鹿にしてはいけません。ここには変数の使い方、繰り返し処理、条件判断といったプログラムの基本的な要素がすべて含まれています。

1行目は合計を入れる$sumと0~100まで数える$iの二つの変数に初期値として0を代入しています。このように、複数の変数に同じ値を代入する時は、1行にまとめて記述できます。

2行目のwhileは()で指定した条件が成立している間、{}内の処理を繰り返すことを意味します。()内では、$i -le 100で、$iの値が100以下であるかどうかを判定しています。-leはLess than or Equal(より小さいまたは等しい)を意味します。

4行目の$sum+=$iは、「$sum = $sum + $i」の省略形で、現在の$sumの値と$iの値を加えて、その計算結果を再び$sumに代入することを意味しています。

5行目の$i++は、$iの値を1増加しています。

7行目の$sumは、$sumの結果、5050を表示します。

全体の流れとしては、次のようになります。

まず$sumと$iに0を入れます。$iが100以下であれば、$sumと$iの合計を$sumに入れて、$iを一つ増加させることを繰り返します。これによって、$iの値は1ずつ大きくなります。$iが100を超えると、繰り返し処理を終了します。結果、$sumには0~100までの合計値が入ります。

さて、連載も3回目となりました。ここまで、最も基本的なことを解説しました。次回からは、より実用的な使い方を紹介していきます。