特集次世代WindowsシェルMSH(コード名:Monad)を試す(前編)デジタルアドバンテージ 遠藤 孝信 |
|
|
Cmdlet(コマンドレット)
次にCmdletについて見てみよう。先述したように、CmdletはMSHに内蔵されている(外部のEXEファイルなどではない)コマンドのことである。
■コマンドを検索するget-commandコマンド
利用可能なCmdletの一覧は、「get-commandコマンド」により表示できる。このコマンドをパラメータなしで実行すると、Cmdletのコマンド名と指定可能なパラメータが表示される。
| |
get-commandコマンドによるCmdletの一覧表示 |
(このコマンドに限らず)通常の出力では画面からはみ出した部分が右端で省略されてしまうが、パイプラインとformat-listコマンドを使えば、もう少し詳しい形式での表示も見られる。また、1画面ずつスクロールさせるにはmoreコマンド(moreコマンドの実体は次項で述べる「関数」)も用意されている。
「get-command | format-list | more」の実行結果 |
get-commandコマンドの出力を詳細な形式で、1画面ずつスクロールさせながらみていくことができる。 |
逆に、短い形式でたくさん表示したい場合には、「format-wideコマンド」を利用する。このコマンドにはカラム数を指定する「-columnsオプション」やカラム数を自動調節する「-autosizeオプション」などが用意されている。
| |
format-wideコマンドを使用した短い形式での出力 | |
-columnsオプションでは列に表示しきれない項目は末尾部分が省略される。省略させずに画面の幅いっぱいまで表示するには-autosizeオプションを使えばよい。 |
冒頭のaliasコマンドのときと同様に、利用可能なCmdletの一覧は別ページ「command.html」に用意した。このcommand.htmlは次のようなコマンドで作成したものだ。今回は<table>タグへの「border=1」の追加もコマンドラインに含めている。
| |
Cmdletの一覧をcommand.htmlに出力 | |
ここでは詳細な説明は割愛するが、foreachコマンドはパイプラインから得た各データについて{}ブロック内を実行する。そのそれぞれデータは特殊変数「$_」で示され、それに対して「-replaceオペレータ」で<table>を<table border=1>に置換している。 |
get-commandコマンドは通常、使いたいコマンドの名前が一部しか分からないときなどに使う。次の例は、Cmdletの名詞部分が「alias」であるCmdletの一覧を表示する。
| |
「get-command -noun alias」によるコマンドの検索 | |
名詞部分が「alias」のCmdletを一覧表示する。 |
パラメータにはワイルドカード(*、?、[a-z]など)も利用できるが、この場合にはCmdlet以外の実行可能なコマンド(エイリアスや関数、スクリプト・ファイル、外部アプリケーション)なども検索対象となるようだ。
ちなみにCmdletでは、オプション名をほかのオプション名と区別できる範囲で省略できる。例えばget-commandコマンドの「n」で始まるオプションには「-noun」と「-name」があるが、これらはそれぞれ「-no」「-na」と省略できる。
■ヘルプの表示
各Cmdletの使い方を見るには、「-?」オプションを指定して実行すればよい。これは「get-helpコマンド」のパラメータにCmdlet名を指定しても同じ出力を得られる。
| |
get-helpコマンドによるヘルプの表示 | |
ここではget-helpコマンド自体のヘルプを表示している。これは「get-help -?」を実行しても表示できる。 |
ヘルプの形式はUNIXのmanコマンドに似ている。
関数(Function)
エイリアスやCmdlet以外でMSHの実行可能な内蔵コマンドとしては関数(Function)がある。関数とは、MSHで決められているスクリプト言語の文法(これはC#に似ている)に従って記述した一連のコードに名前を付けたものだ。関数はコマンドラインからも定義できるし、スクリプト・ファイル内でも定義できる。
ところで、コマンド・プロンプトでは「C:」や「D:」のみの実行でカレント・ドライブを切り替えることができる。そしてこれはMSHでも可能だ。しかし、「Alias:」や「HKLM:」は駄目である。これはなぜかというと、実は「C:」や「D:」という名前の関数があらかじめ定義されているのだ。
すでに見てきたように、関数にはプロバイダが用意されているため、次のようにして定義されている関数の一覧を見ることができる。
| |
dirコマンドによる関数の一覧表示 | |
途中省略しているが、AからZまでのドライブ用にあらかじめ関数が用意されている。現在のMSHのバージョンでは、これらの関数はすべてハードコーディングされているようだ。 |
「C:」と同様な「Alias:」という関数を定義するには、「function」というキーワードを用いて次のようなコマンドを実行すればよい*。
| |
「Alias:関数」の定義 | |
「Alias:」が実行されると、実際には「set-location alias:」が実行される。これはカレント・ドライブをAliasドライブに切り替える。 |
* エイリアスで実現できてもよさそうな気がするが、現バージョンではエイリアスは1つのCmdletか実行ファイルの名前のみに対してしか定義できないようだ。 |
■プロンプトの定義
関数の中でもpromptという関数は少し特別で、この関数の出力はシェルのプロンプトの表示に使用される。これによりプロンプトを自分の好みに簡単に変更できる。
たいていのシェルでよくある例だが、次の例ではプロンプトで日時を表示するようにしている。
| |
prompt関数の定義によるプロンプトの変更 |
■プロファイルの記述
日常的に使う関数やエイリアスは、プロファイルに記述しておけばMSHの起動時に自動的に実行される。MSHのプロファイルには何種類か用意されているが、その1つはマイドキュメントのmshフォルダ内に配置する「profile.msh」である(自分で作成する必要がある)。
| |
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) | ||
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|