Test-Pathコマンドレットで変数の有無を確認できる
タイトルのとおりです。
知らなかった…
変数を確認する
どんな変数が宣言されているかはGet-Variableコマンドレットを使えばわかります。
パラメータなしで実行すると、何もかも出てきます。
しかし、特定のスコープに存在するかまではわかりません。 そこで、パラメータに変数名とスコープを渡してやると特定してくれます。
Get-Variable -Name aaa -Scope Script
しかし、宣言してない変数はもちろん存在しないのでエラーになります。
Get-Variable : 名前 'aaa' の変数が見つかりません。 発生場所 行:1 文字:1 + Get-Variable -Name aaa -Scope Script + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (aab:String) [Get-Variable], ItemNotFoundException + FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.GetVariableCommand
これを使って宣言されている変数なのかチェックしようと思うと、Trapなんかを使ったりしないといけないかなーと思っていたのですが。 まったくの不勉強でした。
Test-Path
実際にTest-Pathを使って存在チェックをしているとあるソースをGithubで見かけて調べていたのですが、StackOverflowにもありました。 しかも、「powershell 変数 存在 確認」などの検索キーワードでググれば普通にマイナビのコラム「GUIユーザーのためのPowerShell入門」の「変数の扱い」という記事に記載がありました。
まじかよ・・・
GUIユーザーのためのPowerShell入門 (3) 変数の扱い http://news.mynavi.jp/column/powershell/003/
公式ドキュメントも見てみることにしました。 確かにほのめかしてあります。
Test-Path https://technet.microsoft.com/ja-jp/library/hh849776.aspx
Test-Path コマンドレットは、プロバイダーによって公開されているデータを使用するように設計されています。セッションで使用可能なプロバイダーの一覧を表示するには、「Get-PSProvider」と入力します。詳細については、「about_Providers」を参照してください。
でもサンプルにはレジストリの例までしか掲載されていませんでした。 ということで、さらにドキュメントに従って「about_Providers」も調べてみることにしました。
プロバイダー ドライブ データ ストア Alias Alias: Windows PowerShell エイリアス Certificate Cert: デジタル署名用の X509 証明書 Environment Env: Windows 環境変数 FileSystem * ファイル システムのドライブ、ディレクトリ、およびファイル Function Function: Windows PowerShell の関数 Registry HKLM:、HKCU: Windows レジストリ Variable Variable: Windows PowerShell の変数 WS-Management WSMan: WS-Management 構成情報
しっかり入ってる!!Variable:というドライブ!!?
なるほど、だからそういう…
こうなると、以下のようにできます。
Test-Path Variable:aaa
そして、もちろんこのコマンドレットは真偽値が返されるのでエラーにもなりません。 そのうえ、条件分岐でも使いやすい。
え?スコープ付きのときは? こうでしょ。
Test-Path Variable:Script:aaa
なんでそんな変な形かですって?
だって宣言するときにそうしませんか?
$Script:aaa = 1
ほら。Test-Pathのときは$がないだけですね。
蛇足
これを調べることで、以下のコマンドレットでも同じようにできることがわかります。
ChildItem コマンドレット Get-ChildItem
Content コマンドレット Add-Content Clear-Content Get-Content Set-Content
Item コマンドレット Clear-Item Copy-Item Get-Item Invoke-Item Move-Item New-Item Remove-Item Rename-Item Set-Item
ItemProperty コマンドレット Clear-ItemProperty Copy-ItemProperty Get-ItemProperty Move-ItemProperty New-ItemProperty Remove-ItemProperty Rename-ItemProperty Set-ItemProperty
Location コマンドレット Get-Location Pop-Location Push-Location Set-Location
Path コマンドレット Join-Path Convert-Path Split-Path Resolve-Path Test-Path
PSDrive コマンドレット Get-PSDrive New-PSDrive Remove-PSDrive
PSProvider コマンドレット Get-PSProvider
Get-Contentコマンドレットがありますが、やはり中身を取り出すことができます。 こんなことしなくてもいいんですけどね…
Get-Content -Path Variable:aaa
なんだか他の用途も思いつきそうですね。














