PowerShell ドライブによるデータアクセスの抽象化

概要

  • 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 プロバイダーとして実装することもできそうだから、何か面白いことに使えないかな。

参考文献

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>