特集

次世代WindowsシェルMSH(コード名:Monad)を試す(前編)

デジタルアドバンテージ 遠藤 孝信
2006/04/12

Page1 Page2 Page3

Cmdlet(コマンドレット)

 次にCmdletについて見てみよう。先述したように、CmdletはMSHに内蔵されている(外部のEXEファイルなどではない)コマンドのことである。

■コマンドを検索するget-commandコマンド

 利用可能なCmdletの一覧は、「get-commandコマンド」により表示できる。このコマンドをパラメータなしで実行すると、Cmdletのコマンド名と指定可能なパラメータが表示される。

MSH 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 [-Type] MshMember...
Cmdlet        add-mshsnapin    add-mshsnapin [-Name] String...
Cmdlet        clear-content    clear-content [-Path] String...
Cmdlet        clear-item       clear-item [-Path] String[] ...
Cmdlet        clear-property   clear-property [-Path] Strin...
Cmdlet        clear-variable   clear-variable [-Name] Strin...
…… 以下省略 ……
get-commandコマンドによるCmdletの一覧表示

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


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

 逆に、短い形式でたくさん表示したい場合には、「format-wideコマンド」を利用する。このコマンドにはカラム数を指定する「-columnsオプション」やカラム数を自動調節する「-autosizeオプション」などが用意されている。

MSH C:\tmp> get-command | format-wide -columns 4

add-content    add-history    add-member     add-mshsnapin
clear-content  clear-item     clear-property clear-variable
combine-path   compare-object convert-HTML   convert-path
copy-item      copy-property  export-alias   export-clixml
export-Console export-csv     export-Secu... foreach-object
…… 以下省略 ……
format-wideコマンドを使用した短い形式での出力
-columnsオプションでは列に表示しきれない項目は末尾部分が省略される。省略させずに画面の幅いっぱいまで表示するには-autosizeオプションを使えばよい。

 冒頭のaliasコマンドのときと同様に、利用可能なCmdletの一覧は別ページ「command.html」に用意した。このcommand.htmlは次のようなコマンドで作成したものだ。今回は<table>タグへの「border=1」の追加もコマンドラインに含めている。

get-command | select name, definition | convert-html | foreach {$_ -replace "<table>", "<table border=1>"} > command.html
Cmdletの一覧をcommand.htmlに出力
ここでは詳細な説明は割愛するが、foreachコマンドはパイプラインから得た各データについて{}ブロック内を実行する。そのそれぞれデータは特殊変数「$_」で示され、それに対して「-replaceオペレータ」で<table>を<table border=1>に置換している。

 get-commandコマンドは通常、使いたいコマンドの名前が一部しか分からないときなどに使う。次の例は、Cmdletの名詞部分が「alias」であるCmdletの一覧を表示する。

MSH 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 [-V...
Cmdlet        set-alias        set-alias [-Name] String [-V...
「get-command -noun alias」によるコマンドの検索
名詞部分が「alias」のCmdletを一覧表示する。

 パラメータにはワイルドカード(*、?、[a-z]など)も利用できるが、この場合にはCmdlet以外の実行可能なコマンド(エイリアスや関数、スクリプト・ファイル、外部アプリケーション)なども検索対象となるようだ。

 ちなみにCmdletでは、オプション名をほかのオプション名と区別できる範囲で省略できる。例えばget-commandコマンドの「n」で始まるオプションには「-noun」と「-name」があるが、これらはそれぞれ「-no」「-na」と省略できる。

■ヘルプの表示

 各Cmdletの使い方を見るには、「-?」オプションを指定して実行すればよい。これは「get-helpコマンド」のパラメータにCmdlet名を指定しても同じ出力を得られる。

MSH C:\Documents and Settings\taka-e> get-help get-help

NAME
    get-help

SYNOPSIS
    Opens the help files


DETAILED DESCRIPTION

    This command also supports the ubiquitous parameters:
    -Debug (-db), -ErrorAction (-ea), -ErrorVariable (-ev)
    -OutBuffer (-ob), -OutVariable (-ov), and -Verbose (-vb)

SYNTAX
    get-help [[-Name] System.String] [-Component System.String
    []] [-Functionality System.String[]] [-Role System.Str
    ing[]] [-Category System.String[]]


PARAMETERS
    -Name System.String
        Name of the Cmdlet to get help for.
…… 以下省略 ……
get-helpコマンドによるヘルプの表示
ここではget-helpコマンド自体のヘルプを表示している。これは「get-help -?」を実行しても表示できる。

 ヘルプの形式はUNIXのmanコマンドに似ている。

関数(Function)

 エイリアスやCmdlet以外でMSHの実行可能な内蔵コマンドとしては関数(Function)がある。関数とは、MSHで決められているスクリプト言語の文法(これはC#に似ている)に従って記述した一連のコードに名前を付けたものだ。関数はコマンドラインからも定義できるし、スクリプト・ファイル内でも定義できる。

 ところで、コマンド・プロンプトでは「C:」や「D:」のみの実行でカレント・ドライブを切り替えることができる。そしてこれはMSHでも可能だ。しかし、「Alias:」や「HKLM:」は駄目である。これはなぜかというと、実は「C:」や「D:」という名前の関数があらかじめ定義されているのだ。

 すでに見てきたように、関数にはプロバイダが用意されているため、次のようにして定義されている関数の一覧を見ることができる。

MSH C:\tmp> dir function:

CommandType     Name           Definition
-----------     ----           ----------
Function        prompt         'MSH ' + $(get-location) + $...
Function        clear-host     $spaceType = [System.Managem...
Function        more              if($args.length -ne 0)   ...
Function        help           get-help $args[0] | out-host...
Function        man            get-help $args[0] | out-host...
Function        mkdir          new-item -type directory -pa...
Function        md             new-item -type directory -pa...
Function        A:             set-location A:
Function        B:             set-location B:
Function        C:             set-location C:
…… 途中省略 ……
Function        X:             set-location X:
Function        Y:             set-location Y:
Function        Z:             set-location Z:
dirコマンドによる関数の一覧表示
途中省略しているが、AからZまでのドライブ用にあらかじめ関数が用意されている。現在のMSHのバージョンでは、これらの関数はすべてハードコーディングされているようだ。

 「C:」と同様な「Alias:」という関数を定義するには、「function」というキーワードを用いて次のようなコマンドを実行すればよい*

MSH C:\tmp> function Alias: { set-location alias: }
MSH C:\tmp> alias:
MSH Alias:\>
「Alias:関数」の定義
「Alias:」が実行されると、実際には「set-location alias:」が実行される。これはカレント・ドライブをAliasドライブに切り替える。

* エイリアスで実現できてもよさそうな気がするが、現バージョンではエイリアスは1つのCmdletか実行ファイルの名前のみに対してしか定義できないようだ。

■プロンプトの定義

 関数の中でもpromptという関数は少し特別で、この関数の出力はシェルのプロンプトの表示に使用される。これによりプロンプトを自分の好みに簡単に変更できる。

 たいていのシェルでよくある例だが、次の例ではプロンプトで日時を表示するようにしている。

MSH C:\tmp>
MSH C:\tmp> function prompt { 'MSH ' + $(date) + '> '}
MSH 2006/04/07 2:19:12>
MSH 2006/04/07 2:19:13> date

2006年4月7日 2:19:17

MSH 2006/04/07 2:19:17>
prompt関数の定義によるプロンプトの変更

■プロファイルの記述

 日常的に使う関数やエイリアスは、プロファイルに記述しておけばMSHの起動時に自動的に実行される。MSHのプロファイルには何種類か用意されているが、その1つはマイドキュメントのmshフォルダ内に配置する「profile.msh」である(自分で作成する必要がある)。

MSH 2006/04/07 3:40:53> cd "$home/my documents/msh"
MSH 2006/04/07 3:41:03> type profile.msh
set-alias c clear-host

function prompt {
  'MSH ' + $(date) + '> '
}
MSHのプロファイル「profile.msh」
マイドキュメントのmshフォルダ内にある「profile.msh」にエイリアスや関数を定義しておけばMSHの起動時に読み込まれる。

 ただしprofile.mshが実行されるようにするには、すでに述べたようにレジストリでExecutionPolicy値のデータを「Unrestricted」などに変更しておく必要がある。「デジタル署名されているシェル・スクリプトのみ、確認後に実行可能」などの設定も可能で、MSHではシェル・スクリプトの実行に関してかなりセキュリティを厳しくしている。

 以上、今回はエイリアス、ドライブ(プロバイダ)、CmdletなどのMSHの機能要素を中心にまずは解説した。次回ではパイプライン処理(すでにお気づきのように、MSHではパイプラインの中を流れるデータは単なるテキストではないのだ)やファイル操作、プロセス操作などについて見ていく予定だ。

 MSHはまだベータ版ではあるが、筆者が試用している限りにおいては不具合は一度も発生しておらず、かなり安定しているようである。残念ながらWindows Vistaには間に合わないらしいが、MSHが新しいGUIに依存するようなこともなさそうなので、そのことは大した問題ではないだろう。

 現行のコマンド・プロンプトに不満のある方や、コマンドラインでのオペレーションやスクリプト記述が好きな方は、MSHを1つの新しい.NETアプリケーションとして楽しむことができるはずだ。

 

 INDEX
  [特集] 次世代WindowsシェルMSH(コード名:Monad)を試す(前編)
    1. エイリアスが基本となるオペレーション
    2. プロバイダとして提供される各種ドライブ
  3. Cmdlet(コマンドレット)と関数(Function)
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間