これまでコマンドレットを中心にその使い方を紹介してきた。PowerShellをより使いこなしていくには、コマンドレットだけではなくプログラミング言語としての側面について知っておく必要がある。今回はPowerShellにおける基本のひとつである変数について説明する。

変数

PowerShellでは次のように変数名に$をつけた状態で変数を設定する。次の処理でvという変数に「Welcome to the new world」という文字列が設定される。

変数vに「Welcome to the new world」という文字列を代入

PS /Users/daichi> $v = "Welcome to the new world"
PS /Users/daichi>

 

変数は$を付けた状態でアクセスできる。上記の例だと$vという記述で変数を利用できる。

$をつけた状態で変数を利用する

PS /Users/daichi> $v
Welcome to the new world
PS /Users/daichi>

 

変数にはアルファベットとアンダーバーを使用できる。大文字と小文字は区別されないので、上記の例だと$vとして変数を設定したものの、$Vでもアクセスできるようになっている。アルファベットとアンダーバー以外も使えるのだが、書き方が面倒になってくるので基本的に使わない方が無難だ。

変数は何度も代入することができ、その都度上書きされる。

変数は再度代入することで上書きできる

PS /Users/daichi> $v = "Hello world"
PS /Users/daichi> $v
Hello world
PS /Users/daichi>

 

変数の削除はRemove-Variableコマンドレットで行う。Remove-Variableコマンドレットに指定する場合には$はつけないで実行する。

Remove-Variableで変数を削除

PS /Users/daichi> Remove-Variable v
PS /Users/daichi> $v
PS /Users/daichi>

 

変数とオブジェクト

PowerShellの変数にはオブジェクトをなんでも代入することができる。変数には型があるが、どの型になるかはPowerShellによって自動的に処理されるようになっている。

例えば次のように記述すると、Get-Dateコマンドレットを実行した結果のオブジェクトが変数に代入される。この場合の型はSystem.DateTimeということになる。

コマンドレットの実行結果を変数に代入

PS /Users/daichi> $v = $(Get-Date)
PS /Users/daichi> $v

2018年7月11日 水曜日 18:12:31


PS /Users/daichi>

 

次のように実行すると、年を表現する値が変数に代入される。この場合$vの型はSystem.Int32ということになる。

コマンドレットの実行結果の、さらにそのプロパティの値を変数に代入

PS /Users/daichi> $v = $(Get-Date).Year
PS /Users/daichi> $v
2018
PS /Users/daichi>

 

配列についてはまた別の回で取り上げるので詳しい説明は省くが、PowerShellでは配列を変数に代入することができ、さらに配列の要素は同じ型である必要がないという特徴がある。

例えば、次のように実行すると、System.Int32、System.String、System.DateTimeという3つの型が一つの配列として変数vに代入されることになる。

型は複数の型で構成されていてもよく、それらを変数に代入することができる

PS /Users/daichi> $v = 1, "2", $(Get-Date)
PS /Users/daichi> $v[0]
1
PS /Users/daichi> $v[1]
2
PS /Users/daichi> $v[2]

2018年7月11日 水曜日 18:14:37


PS /Users/daichi>

 

型の固定

PowerShellでは型を固定することもできる。次のように変数の前に[型]といった記述を追加すると、その型として値が代入されるようになる。

例えば次のようにSystem.Int32で固定すると、文字列を代入しようとしても、整数に変換されてから変数vに代入されるようになる。結果、加算を実施すると整数の演算として処理される。

System.Int32に型を固定して代入。加算は整数の加算になる

PS /Users/daichi> [System.Int32]$v = "1"
PS /Users/daichi> [System.Int32]$x = "2"
PS /Users/daichi> $v + $x
3
PS /Users/daichi>

 

次の例は変数をSystem.Stringで固定して代入するものだ。整数と指定しているが、型がSystem.Stringで固定されているので、整数から文字列に変換してから変数に代入される。このため、加算を実施すると整数の加算ではなく、文字列の連結が実施される。

System.Stringに型を固定して代入。加算は文字列の連結になる

PS /Users/daichi> [System.String]$v = 1
PS /Users/daichi> [System.String]$x = 2
PS /Users/daichi> $v + $x
12
PS /Users/daichi>

 

次のようにSystem.DateTimeで型を固定すると、”2018/07/11”という文字列で代入しようとしても、System.DateTimeに変換されてから代入されるようになる。

System.DateTimeに型を固定して代入

PS /Users/daichi> [System.DateTime]$v = "2018/07/11"
PS /Users/daichi> $v

2018年7月11日 水曜日 0:00:00


PS /Users/daichi>

 

変数とクォート

変数はダブルクォーテーションで囲んでも変数として利用できる。シングルクォーテーションで囲むとただの文字列として処理される。

シングルクォーテーションとダブルクォーテーションの違い

PS /Users/daichi> $v = "hello"
PS /Users/daichi> $v
hello
PS /Users/daichi> "$v"
hello
PS /Users/daichi> '$v'
$v
PS /Users/daichi>

 

変数名は{}で囲むことでアルファベットとアンダーバー以外も使えるようになる。

例えば、変数名に-を含めようとした場合、変数名を{}で囲んでおけば利用できる。

変数名を{}で括るとアルファベットとアンダーバー以外も変数に利用できる

PS /Users/daichi> $v-x = "hello"
At line:1 char:3
+ $v-x = "hello"
+   ~~
Unexpected token '-x' in expression or statement.
At line:1 char:1
+ $v-x = "hello"
+ ~~~~
The assignment expression is not valid. The input to an assignment operator must be an object that is able to accept assignments, such as a variable or a property.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

PS /Users/daichi> ${v-x} = "hello"
PS /Users/daichi>

 

アルファベットとアンダーバー以外を含んでいるため{}で囲って変数に代入した場合、アクセスするときにも{}で変数名を囲うようにする。

{}が必要な変数はアクセスするときも{}で囲む

PS /Users/daichi> $v-x
At line:1 char:3
+ $v-x
+   ~~
Unexpected token '-x' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

PS /Users/daichi> ${v-x}
hello
PS /Users/daichi>

 

変数名に{や}そのものを含めることもできるのだが、それを実現するためにさらにクォートを実施する必要があってとても読みにくくなるので、避けた方がよいだろう。

変数とスコープ

変数は基本的に利用を開始した場所のスコープに従って処理される。スコープを明示的に指定することもできる。このあたりは関数を扱うときに詳しく取り上げよう。

PowerShell Coreを起動してから設定した変数は、PowerShell Coreを終了すると消えていく。このため、毎回同じ変数を利用したいということであれば、「【第4回】プロファイルを活用しよう」を参考にプロファイルに変数を設定しておけばよい。それで毎回PowerShell Core起動時に変数が設定されるようになる。

これがPowerShellで利用できる変数の基本だ。PowerShellの変数は型を指定することも型を指定せずに使うこともでき、さらに配列を保持することもできる。かなり強力な機能だ。利用方法も簡単なので使い方を覚えてしまおう。

参考資料