特集
» 2006年07月19日 00時00分 公開

特集:Windows PowerShellレビュー(前編):次世代Windowsシェル「Windows PowerShell」を試す (3/3)

[遠藤孝信,デジタルアドバンテージ]
前のページへ 1|2|3       

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...
……以下省略……

Get-CommandコマンドによるCmdletの一覧表示

 (このコマンドに限らず)通常の出力では画面からはみ出した部分が右端で省略されてしまうが、パイプと「Format-Listコマンド」を使えば、より詳しい形式での表示も可能だ。また、1画面ずつスクロールさせるにはmoreコマンド(moreコマンドの実体は次項で述べる「関数」)も用意されている。

「Get-Command | Format-List | more」の実行結果
Get-Commandコマンドの出力を、詳細な形式で1画面ずつスクロールさせながら見ていくことができる。

 逆に、短い形式でたくさん表示したい場合には、「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
……以下省略……

Format-Wideコマンドを使用した短い形式での出力
「-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

Cmdletの一覧を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> [...

Get-Commandコマンドによるコマンドの検索
名詞部分が「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 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:

dirコマンドによる定義済み関数の一覧表示
途中省略しているが、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:」という関数を定義し、その内容を確認した後、それを実行している。「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関数の内容を表示した後、プロンプトに日時を表示するように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) + '> '
}

PowerShellのプロファイル「profile.ps1」の記述例
マイドキュメントの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四半期らしい)。

「特集:Windows PowerShellレビュー」のインデックス

特集:Windows PowerShellレビュー

前のページへ 1|2|3       

Copyright© Digital Advantage Corp. All Rights Reserved.

編集部からのお知らせ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。