適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話など気になったことも載せているブログです。

【Remove-Variable】変数を削除したいよーというときに読む記事【PowerShell】

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

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

そして、それらを跡形もなく消し去りたい・・・。

え?ない?そんなことは・・・いや、きっとあると思います。

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

Remove-Variableとは?

PowerShellではRemoveは削除と同義です。Variableは変数です。つまり変数を削除するコマンドレットです。

変数を削除してしまうので跡形もなくなります。

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

Deletes a variable and its value.

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

どんな動きをするか

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

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

変数 variableが削除されていることが確認できます。

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

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

Remove-Variable -Name variable
$variable -eq $null

$variableはnullです。

完全に変数自体が削除されました。

ちなみに変数の値を変数の名前と解釈されてしまいますので注意です。

 
Remove-Variable -Name $variable

結果

Remove-Variable : 名前 '変数だよ' の変数が見つかりません。
発生場所 行:1 文字:1
+ Remove-Variable -Name $variable -WhatIf
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (変数だよ:String) [Remove-Variable], ItemNotFoundException
    + FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.RemoveVariableCommand

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

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

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

Specifies the name of the variable to be removed. The parameter name (Name) is optional. Wildcards are permitted

特定の名前の変数が取り除かれる。Nameというパラメータ名はオプションである。ワイルドカードが許可される

これです。ワイルドカードが許可されるのでワイルドカードを指定してあげれば、変数が全て削除されます。

実際に挙動を確認してみます。

 
$testVariable="変数"
Remove-Variable -Name * -WhatIf

結果

WhatIf: 対象 "名前: null" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: false" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: true" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MaximumErrorCount" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MaximumVariableCount" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MaximumFunctionCount" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MaximumAliasCount" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MaximumDriveCount" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: Error" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: Host" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: ExecutionContext" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSVersionTable" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSEdition" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PID" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: ShellId" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSHOME" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: testVariable" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSScriptRoot" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSCommandPath" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: $" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: ^" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: args" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: input" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: PSBoundParameters" に対して操作 "変数の削除" を実行しています。
WhatIf: 対象 "名前: MyInvocation" に対して操作 "変数の削除" を実行しています。

どんな変数が削除されるのかが一目でわかります。

たくさんの自動変数の中に自分が定義した$$testVariable変数がありますね。

ここで、「え?自動変数まで削除されちゃうの?」と思ったあなた。安心してください。結果から言うと自動変数は削除されません。

試しに-WhatIfを取って実行してみると

 
Remove-Variable -Name *

結果の一部

Remove-Variable : 変数 null は定数または読み取り専用であるため、削除できません。変数が読み取り専用である場合は、Force オプションを指定して操作を再試行してください。
発生場所 行:1 文字:1
+ Remove-Variable -Name *
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (null:String) [Remove-Variable], SessionStateUnauthorizedAccessException
    + FullyQualifiedErrorId : VariableNotRemovable,Microsoft.PowerShell.Commands.RemoveVariableCommand

もしくは

Remove-Variable : 変数 PSScriptRoot を削除できません。この変数は、既に最適化されて、削除不可になっています。Remove-Variable コマンドレット (エイリアスなし) を使用するか、使用しているコマンドをドット ソース形式にして、変数を削除してください。
発生場所 行:1 文字:1
+ Remove-Variable -Name *
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (PSScriptRoot:String) [Remove-Variable], SessionStateUnauthorizedAccessException
    + FullyQualifiedErrorId : VariableNotRemovableRare,Microsoft.PowerShell.Commands.RemoveVariableCommand

と表示され、削除されません。

無事に自分が定義した変数だけが削除されます。

なんと便利!!

終わりに

PowerShellで変数を削除するコマンドレット、Remve-Variableを紹介しました。

ワイルドカードが使えるコマンドレットはとても便利ですね。

とても便利なコマンドレットですが、変数の削除はシステム的に重要なことなので、念のため-WhatIfで挙動を確認しておくことも大事かと思います。

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