次世代Windowsシェル「Windows PowerShell」を試す:特集:Windows PowerShellレビュー(前編)(3/3 ページ)
Monadレビュー記事の改訂版。複雑化を極めるWindows環境をマイクロソフトの新シェルPowerShellはいかにして扱うのか?
Cmdlet(コマンドレット)
次にCmdletについて見てみよう。先述したように、CmdletはPowerShellに内蔵されている(外部のEXEファイルなどではない)コマンドのことであり、現在のバージョンでは合計129個のCmdletが標準で用意されている。
■コマンドを検索するGet-Commandコマンド
利用可能なCmdletの一覧は、「Get-Commandコマンド」により表示できる。このコマンドをパラメータなしで実行すると、Cmdletのコマンド名と指定可能なパラメータが一覧表示される。
PS C:\tmp> Get-Command
CommandType Name Definition
----------- ---- ----------
Cmdlet Add-Content Add-Content [-Path] <String[...
Cmdlet Add-History Add-History [[-InputObject] ...
Cmdlet Add-Member Add-Member [-MemberType] <PS...
Cmdlet Add-PSSnapin Add-PSSnapin [-Name] <String...
Cmdlet Clear-Content Clear-Content [-Path] <Strin...
Cmdlet Clear-Item Clear-Item [-Path] <String[]...
Cmdlet Clear-ItemProperty Clear-ItemProperty [-Path] <...
Cmdlet Clear-Variable Clear-Variable [-Name] <Stri...
……以下省略……
(このコマンドに限らず)通常の出力では画面からはみ出した部分が右端で省略されてしまうが、パイプと「Format-Listコマンド」を使えば、より詳しい形式での表示も可能だ。また、1画面ずつスクロールさせるにはmoreコマンド(moreコマンドの実体は次項で述べる「関数」)も用意されている。
逆に、短い形式でたくさん表示したい場合には、「Format-Wideコマンド」を利用する。このコマンドにはカラム数を指定する「-Columnオプション」やカラム数を自動調節する「-AutoSize」などが用意されている。
PS C:\tmp> Get-Command | Format-Wide -Column 4
Add-Content Add-History Add-Member Add-PSSnapin
Clear-Content Clear-Item Clear-ItemProp... Clear-Variable
Compare-Object ConvertFrom-Se... Convert-Path ConvertTo-Html
ConvertTo-Secu... Copy-Item Copy-ItemPrope... Export-Alias
Export-Clixml Export-Console Export-Csv ForEach-Object
Format-Custom Format-List Format-Table Format-Wide
Get-Acl Get-Alias Get-Authentico... Get-ChildItem
Get-Command Get-Content Get-Credential Get-Culture
……以下省略……
「-Columnオプション」使用時には、列内に表示しきれない項目は末尾部分が省略される。省略させずに画面の幅いっぱいまで表示するには「-AutoSizeオプション」を使えばよい。
冒頭のaliasコマンドのときと同様に、利用可能なCmdletの一覧は別ページ「command.html」に用意した。このcommand.htmlは次のようなコマンドで作成したものだ。今回は<table>タグへの「border=1」の追加もコマンドラインに含めている。
Get-Command | select name, definition | ConvertTo-Html | foreach { $_ -replace "<table>", "<table border=1>" } > command.html
ここでは詳細な説明は割愛するが、foreachコマンドはパイプから得た各データについて{}ブロック内を実行する。そのそれぞれのデータは特殊なシェル変数「$_」で示され、それに対して「-replaceオペレータ」で<table>を<table border=1>に置換している。
Get-Commandコマンドは通常、使いたいコマンドの名前が一部しか分からないときなどに使用する。次の例は、Cmdletの名詞部分が「alias」であるCmdletの一覧を表示する。
PS C:\tmp> Get-Command -Noun alias
CommandType Name Definition
----------- ---- ----------
Cmdlet Export-Alias Export-Alias [-Path] <String...
Cmdlet Get-Alias Get-Alias [[-Name] <String[]...
Cmdlet Import-Alias Import-Alias [-Path] <String...
Cmdlet New-Alias New-Alias [-Name] <String> [...
Cmdlet Set-Alias Set-Alias [-Name] <String> [...
名詞部分が「alias」のCmdletを一覧表示している。
パラメータにはワイルドカード(*、?、[a-z]など)も利用できるが、この場合にはCmdlet以外の実行可能なコマンド(エイリアスや関数、スクリプト・ファイル、外部アプリケーション)なども検索対象となるようだ。
ちなみにCmdletでは、オプション名をほかのオプション名と区別できる範囲で省略できる。例えばGet-Commandコマンドの「n」で始まるオプションには「-Noun」と「-Name」があるが、これらはそれぞれ「-No」「-Na」と省略できる。
■ヘルプの表示
各Cmdletの使い方を見るには、「-?」オプションを指定して実行すればよい。これは「get-helpコマンド」のパラメータにCmdlet名を指定しても同じ出力を得られる。以下の例では、Get-Helpコマンドのヘルプを表示している。
PS C:\tmp> Get-Help -?
NAME
Get-Help
SYNOPSIS
Opens the help files
DETAILED DESCRIPTION
The get-help Cmdlet accesses the help files contained in t
he command shell. You can access the general help informat
ion by topic or get the help file for each, individual Cmd
let.
This command also supports the ubiquitous parameters:
-Debug (-db), -ErrorAction (-ea), -ErrorVariable (-ev)
-OutBuffer (-ob), -OutVariable (-ov), and -Verbose (-v
b).
To learn more see help about_ubiquitous_parameters.
USAGE
Get-Help [[-Name] <System.String>] [-Component <System.Str
ing[]>] [-Functionality <System.String[]>] [-Role <System.
String[]>] [-Category <System.String[]>] [-Verbose [<Syste
m.Boolean>]] [-Debug [<System.Boolean>]] [-ErrorAction <Ac
……以下省略……
ここではget-helpコマンドのヘルプを表示している。これは「Get-Help get-help」を実行しても表示できる。
ヘルプの形式はUNIXのmanコマンドに似ている。
関数(Function)
エイリアスやCmdlet以外でPowerShellの実行可能な内蔵コマンドとしては関数(Function)がある。
関数とは、PowerShellで決められているスクリプト言語の文法(これはC#に似ている)に従って記述した一連のコードに名前を付けたものだ。関数はコマンドラインからも定義できるし、スクリプト・ファイル内でも定義できる。
ところで、コマンド・プロンプトでは「C:」や「D:」のみの実行でカレント・ドライブを切り替えることができる。そしてこれはPowerShellでも可能だ。しかし、「Alias:」や「HKLM:」は駄目である。これはなぜかというと、実は「C:」や「D:」という名前の関数があらかじめ定義されているのだ。
すでに見てきたように、関数に対してはプロバイダが用意されているため、次のようにして現在定義されている関数の一覧を見ることができる。
PS C:\tmp> dir Function:
CommandType Name Definition
----------- ---- ----------
Function prompt 'PS ' + $(Get-Location) + $(...
Function TabExpansion ...
Function Clear-Host $spaceType = [System.Managem...
Function more param([string[]]$paths); if...
Function help param([string]$help); Get-He...
Function man param([string]$help); Get-He...
Function mkdir param([string[]]$paths); New...
Function md param([string[]]$paths); New...
Function A: Set-Location A:
Function B: Set-Location B:
Function C: Set-Location C:
Function D: Set-Location D:
……途中省略……
Function X: Set-Location X:
Function Y: Set-Location Y:
Function Z: Set-Location Z:
途中省略しているが、AからZまでのドライブ用にあらかじめ関数が用意されている。現在のPowerShellのバージョンでは、これらの関数はすべてハードコーディングされているようだ。
「C:」と同様な「Alias:」という関数を定義するには、「function」というキーワードを用いて次のようなコマンドを実行すればよい*。
PS C:\tmp> function Alias: { Set-Location Alias: }
PS C:\tmp> type Function:Alias:
Set-Location Alias:
PS C:\tmp> Alias:
PS Alias:\>
ここでは「Alias:」という関数を定義し、その内容を確認した後、それを実行している。「Alias:」が実行されると、実際には「Set-Location Alias:」が実行される。これはカレント・ドライブをAliasドライブに切り替える。関数名に「:」が利用できるところがミソだ。
* エイリアスで実現できてもよさそうな気がするが、現バージョンではエイリアスは1つのCmdletか実行ファイルの名前のみに対してしか定義できないようだ(パラメータを指定したCmdletをエイリアスできない)。
ちなみに、以下のようなスクリプトを実行すれば、すべての有効なドライブに対して「<ドライブ名>:」という関数を定義できる。
foreach ($drive in Get-PSDrive) {
$name = $Drive.Name + ':';
Invoke-Expression "function global:$name { Set-Location $name }"
}
Invoke-Expressionコマンドはパラメータで指定された文字列をシェルへの入力として実行する。
■プロンプトの定義
関数の中でもpromptという関数は少し特別で、この関数の出力はシェルのプロンプトの表示に使用される。これによりプロンプトを自分の好みに簡単に変更できる。
たいていのシェルでよくある例だが、次の例ではプロンプトで日時を表示するようにしている。
PS C:\tmp> type Function:prompt
'PS ' + $(Get-Location) + $(if ($nestedpromptlevel -ge 1) { '>>' }) + '> '
PS C:\tmp> function prompt { 'PS ' + $(date) + '> '}
PS 2006/06/30 19:21:24> date
2006年6月30日 19:21:36
PS 2006/06/30 19:21:36>
ここではデフォルトのprompt関数の内容を表示した後、プロンプトに日時を表示するようにprompt関数を再定義している。
■プロファイルの記述
日常的に使う関数やエイリアスは、プロファイルに記述しておけばPowerShellの起動時に自動的に実行される。PowerShellのプロファイルには何種類か用意されているが、その1つはマイドキュメントのPSConfigurationフォルダ内にある「profile.ps1」である。
PS 2006/06/30 19:33:49> cd $home/"my documents"/psconfiguration
PS 2006/06/30 19:34:11> type profile.ps1
set-alias c clear-host
function prompt {
'PS ' + $(date) + '> '
}
マイドキュメントのPSConfigurationフォルダ内にある「profile.ps1」にエイリアスや関数を定義しておけばPowerShellの起動時に読み込まれる。
ただしprofile.ps1が実行されるようにするには、すでに述べたように「Set-ExecutionPolicyコマンド」により、スクリプトの実行ポリシーを「Unrestricted」などに変更しておく必要がある。
PowerShellでは「デジタル署名されているスクリプトのみ実行可能(AllSigned)」などの設定も可能で、スクリプトの実行に関してかなりセキュリティを厳しくしている。デフォルトは「Restricted」で、この設定ではすべてのスクリプト・ファイルが実行できない(対話式シェルとしてのみ利用可能)。
以上、今回はエイリアス、ドライブ(プロバイダ)、CmdletなどのPowerShellの機能要素を中心にまずは解説した。まったく新しくシェルでありながら、現行のコマンド・プロンプトでのオペレーションなどもうまくフォローしているといった感じだろうか。
しかしPowerShellで本当に注目すべきはそのような部分ではない。PowerShellの真の威力は、すべてのオペレーションが.NET Frameworkのオブジェクトに基づいている点にある(すでにお気づきのようにPowerShellではパイプの中を流れるデータは単なるテキストではないのだ)。次回後編ではこの点を中心にPowerShellについて見ていく予定だ。
なお、残念ながらPowerShellはWindows Vistaには標準搭載されないらしいが、Microsoftの発表によると正式版のリリースは2006年の後半とされている(より正確には2006年の第4四半期らしい)。
Copyright© Digital Advantage Corp. All Rights Reserved.