次に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
……以下省略……
冒頭のaliasコマンドのときと同様に、利用可能なCmdletの一覧は別ページ「command.html」に用意した。このcommand.htmlは次のようなコマンドで作成したものだ。今回は<table>タグへの「border=1」の追加もコマンドラインに含めている。
Get-Command | select name, definition | ConvertTo-Html | foreach { $_ -replace "<table>", "<table border=1>" } > command.html
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> [...
パラメータにはワイルドカード(*、?、[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
……以下省略……
ヘルプの形式はUNIXのmanコマンドに似ている。
エイリアスや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:
「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:\>
* エイリアスで実現できてもよさそうな気がするが、現バージョンではエイリアスは1つのCmdletか実行ファイルの名前のみに対してしか定義できないようだ(パラメータを指定したCmdletをエイリアスできない)。
ちなみに、以下のようなスクリプトを実行すれば、すべての有効なドライブに対して「<ドライブ名>:」という関数を定義できる。
foreach ($drive in Get-PSDrive) {
$name = $Drive.Name + ':';
Invoke-Expression "function global:$name { Set-Location $name }"
}
■プロンプトの定義
関数の中でも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>
■プロファイルの記述
日常的に使う関数やエイリアスは、プロファイルに記述しておけば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) + '> '
}
ただし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.