概要
- PowerShell では、特別なドライブを使うことで、ファイルのようにレジストリや変数などへアクセスできる
- Clear-Host は、コマンドレットではなく関数だった
PowerShell で変数はどうやって作る?
今日更新された Scripting Guy の翻訳記事を読んでいたら「Windows PowerShell で変数を作成する方法はありますか」という質問が取り上げられていた。
え、そんなの
$i = 0
ってやったら終わりじゃん?と思ったら、我らが Scripting Guy の回答は、
変数を作成して、値をその変数に代入する方法はいくつかあります。次のように、変数ドライブで New-Item コマンドレットを使用すると、変数を作成して値を代入できます。
New-Item -Name temp -Value $env:TEMP -Path variable:
えええ???何それ。
New-Item コマンドレットって、きっと dir の実体の Get-ChildItem コマンドレットの仲間っぽいね。ということはもしかして、「dir variable:」ってやったら、変数の一覧が出てくるのか?
PS C:\Users\daisuke> dir variable: Name Value ---- ----- $ ? True ^ _ args {} ?中略? VerbosePreference SilentlyContinue WarningPreference Continue WhatIfPreference False
うわ。ほんまにでてきたわこれ。
確か、PowerShell では、レジストリのアクセスも、こういった疑似的なドライブ(「Windows PowerShell ドライブ」というらしい)を経由して行うことができたはず。
PowerShell ドライブとは
ヘルプトピックの about_Providers によると、PowerShell プロバイダーと呼ばれる .NET のプログラムがあって、それらによって変数やレジストリなど特殊なデータに、PowerShell からドライブの形でアクセスすることができるらしい。
組み込みの PowerShell プロバイダーは以下の通り。
プロバイダー | ドライブ | データ ストア |
---|---|---|
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 構成情報 |
PowerShell ドライブは、Get-PSDrive コマンドレットで一覧表示することでも得られるし、実際そのドライブに cd コマンドなり Set-Location コマンドレットなりで移動することもできる。
PS C:\Users\daisuke> Get-PSDrive Name Used (GB) Free (GB) Provider Root CurrentLocation ---- --------- --------- -------- ---- --------------- Alias Alias C 42.05 14.54 FileSystem C:\ Users\daisuke cert Certificate \ D FileSystem D:\ E 39.33 15.55 FileSystem E:\ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE Variable Variable WSMan WSMan
ちなみに、Function ドライブを見てみると、おもしろいことがわかった。
PS cert:\currentuser> dir function: CommandType Name Definition ----------- ---- ---------- Function A: Set-Location A: Function B: Set-Location B: Function C: Set-Location C: Function cd.. Set-Location .. Function cd\ Set-Location \ Function Clear-Host $space = New-Object System.Ma... Function D: Set-Location D: …略…
なんと、PowerShell のプロンプトから「C:」と打ち込んでドライブを変更するできるのは、「Set-Location C:」という内容の関数が「C:」という名前で登録されていたからだった。
「Clear-Host」もコマンドレットではなく、何やら長い処理が定義されている。UNIX の「clear」コマンドが、実はシェルスクリプトだった、というのと似ているようでちょっとおもしろかった。
それでどんなことができる?
抽象レイヤーを作ってデータアクセスのインターフェイスを統一するということは、 Microsoft が好きそうなことだけど、ドライブレターという従来の仕様を拡張して組み込んでいるのがおもしろい。
これ、RDB とかネットワーク上のサービスへのアクセスを PowerShell プロバイダーとして実装することもできそうだから、何か面白いことに使えないかな。
参考文献
- about_Providers <http://technet.microsoft.com/ja-jp/library/dd347659.aspx>