次に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.