適材適所

PowerShellやVBAなどプログラミング系の話多めで

【PowerShell】変数をクリアしたいよーというときに読む記事【Clear-Variable】

PowerShellではとっても簡単に変数を定義することができます。

あまりに簡単なのでつい変数を定義して過ぎてしまうことありませんか?

そしてそれらを一発でクリアしたい・・・。

ありますよね、ね?

そんなときはClear-Variableコマンドレットの出番です。

Clear-Variableとは?

PowerShellではClearは初期化と同義です。Variableは変数です。つまり変数を初期化するコマンドレットです。

変数を初期化するだけなので変数自体は残ります。

そこがRemove-Variableコマンドレットと大きく違います。

マイクロソフトのドキュメント(Clear-Variable (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs)を見てみましょう。

Deletes the value of a variable.

すごくわかりやすい。訳は「変数の値を削除する」。

どんな動きをするか

どんな動きをするか確認するときは、-WhatIfが便利です。

 
$variable='変数だよ'
Clear-Variable -Name variable -WhatIf

変数 variableがクリアされるらしいことが確認できます。

WhatIf: 対象 "名前: variable" に対して操作 "変数のクリア" を実行しています。

-WhatIfを指定せずに実行すると、しれっと処理されます。

Clear-Variable -Name variable
$variable -eq $null

$variableはnullになってしまいました。

これじゃ変数が削除されたのとかわらないのでは・・・?

このコマンドレット、オンラインヘルプ(Clear-Variable (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs)には

If the variable has a specified data or object type, this cmdlet preserves the type of the object stored in the variable.

「もしその変数が指定されたデータ型、もしくはオブジェクト型の場合、このコマンドレットはそのオブジェクトの型を変数の中に保存する」とあります。

これだけ読むと、変数の型はそのままにしてくれるのかと誤解してしまいますが、どうやら、ちゃんと型を指定した変数については型の情報を保持してくれるようです。

例えば下記の例では変数 $variableはnullになってしまいました。

PS C:\Users\USER> $variable="test" #型を指定せずに変数を作成する
PS C:\Users\USER> $variable.GetType() #変数の型を調べる

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\USER> Clear-Variable variable
PS C:\Users\USER> $variable.GetType() #Nullだと言って怒られる
null 値の式ではメソッドを呼び出せません。
発生場所 行:1 文字:1
+ $variable.GetType()
+ ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

対してちゃんと型を明示的に指定すると挙動が変わり、しっかり型が保存されていることが確認できます。

PS C:\Users\USER> [string]$variable="test" #型を明示する
PS C:\Users\USER> $variable.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object


PS C:\Users\USER> Clear-Variable variable
PS C:\Users\USER> $variable.GetType() #ちゃんと型が保存されている

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

このコマンドレットで初期化(変数の型に設定されている初期値を代入する)ためには、明示的に変数に型を指定する必要があるため、厳密に変数の定義を行わないと、予期せぬ動作をする可能性があります。

自分が定義した変数だけ消去したい

Clear-Variableコマンドレットで自分が定義した変数だけ消去したいときは、Nameパラメータにはワイルドカードをつかうと実現することができます。

Nameパラメータのドキュメント(Clear-Variable (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs)を確認してみます。

Specifies the name of the variable to be cleared. Wildcards are permitted.

特定の名前の変数がクリアされる。ワイルドカードが許可される

この部分が大事。ワイルドカードが許可されるのでワイルドカードを指定してあげれば、変数が全てクリアされます。

全ての変数がクリアされるということは自動変数も対象になってきますが、自動変数は変なことができないように読み取り専用になっているようなので都合よく自分が作成した変数だけがクリアされます。

終わりに

PowerShellで変数をクリアするコマンドレット、Clear-Variableを紹介しました。

一見便利なコマンドレットに見えますが、変数の型を明示的に指定した場合とそうでない場合で挙動が変わってくる点が少し扱いづらいかも知れません。

逆に言えば、変数の型を明示的に指定しさえすれば、このコマンドレットで変数の初期化が行えるとも考えられます。

使い方次第・・・ということでしょうか。

というわけで、ここまでお読みいただき、ありがとうございました。