検索
リンク
タグ
ASP.NET
.NET
ASP.NET MVC
F#
Visual Studio
Azure
ASP.NET Core
ライトニングトーク
Plone
AJAX
Selenium
C#
jQuery
ADO.NET Entity Framework
SQL Server
JavaScript
LINQ
WebMatrix
EFCore
Fizz-Buzz
カテゴリ
最新の記事
最新のコメント
記事ランキング
最新のトラックバック
以前の記事
2023年 01月 2022年 12月 2022年 11月 2022年 10月 2022年 09月 2022年 08月 2022年 07月 2022年 06月 2022年 05月 2022年 04月 2022年 03月 2022年 02月 2022年 01月 2021年 12月 2021年 11月 2021年 10月 2021年 09月 2021年 08月 2021年 07月 2021年 06月 2021年 05月 2021年 04月 2021年 03月 2021年 02月 2021年 01月 2020年 12月 2020年 11月 2020年 10月 2020年 09月 2020年 08月 2020年 07月 2020年 06月 2020年 05月 2020年 04月 2020年 03月 2020年 02月 2020年 01月 2019年 12月 2019年 11月 2019年 10月 2019年 09月 2019年 08月 2019年 07月 2019年 06月 2019年 05月 2019年 04月 2019年 03月 2019年 02月 2019年 01月 2018年 12月 2018年 11月 2018年 10月 2018年 09月 2018年 08月 2018年 07月 2018年 06月 2018年 05月 2018年 04月 2018年 03月 2018年 02月 2018年 01月 2017年 12月 2017年 11月 2017年 10月 2017年 09月 2017年 08月 2017年 07月 2017年 06月 2017年 05月 2017年 04月 2017年 02月 2017年 01月 2016年 12月 2016年 11月 2016年 10月 2016年 09月 2016年 08月 2016年 07月 2016年 06月 2016年 05月 2016年 04月 2016年 03月 2016年 02月 2016年 01月 2015年 12月 2015年 11月 2015年 10月 2015年 09月 2015年 08月 2015年 07月 2015年 05月 2015年 04月 2015年 03月 2015年 02月 2015年 01月 2014年 12月 2014年 11月 2014年 10月 2014年 09月 2014年 08月 2014年 06月 2014年 04月 2014年 03月 2014年 02月 2014年 01月 2013年 12月 2013年 10月 2013年 09月 2013年 08月 2013年 07月 2013年 06月 2013年 05月 2013年 04月 2013年 03月 2013年 02月 2013年 01月 2012年 12月 2012年 11月 2012年 10月 2012年 09月 2012年 08月 2012年 07月 2012年 06月 2012年 05月 2012年 04月 2012年 03月 2012年 02月 2012年 01月 2011年 12月 2011年 11月 2011年 10月 2011年 09月 2011年 08月 2011年 07月 2011年 06月 2011年 05月 2011年 04月 2011年 03月 2011年 02月 2011年 01月 2010年 12月 2010年 11月 2010年 10月 2010年 09月 2010年 08月 2010年 07月 2010年 06月 2010年 05月 2010年 04月 2010年 03月 2010年 02月 2010年 01月 2009年 12月 2009年 10月 2009年 09月 2009年 07月 2009年 06月 2009年 05月 2009年 04月 2009年 03月 2009年 02月 2009年 01月 2008年 12月 2008年 11月 2008年 10月 2008年 09月 2008年 08月 2008年 07月 2008年 06月 2008年 05月 2008年 04月 2008年 03月 2008年 02月 2008年 01月 2007年 12月 2007年 11月 2007年 04月 2007年 03月 2007年 02月 2007年 01月 2006年 11月 2006年 10月 2006年 09月 2006年 08月 2006年 07月 ファン
ブログジャンル
画像一覧
|
2013年 12月 15日
※本稿は PowerShell Advent Calendar 2013 / 15日目の参加記事です。
PowerShell Advent Calendar にかれこれ3回も参加しておいて言うのもなんだが、実を言うと、長年、PowerShell は食わず嫌いだった。 しかし Windows OS の世代交代も進み、Windows OS に標準で PowerShell がインストールされるようになったなどの各種事情により、社内の IT インフラの自動化に、渋々と PowerShell の使用を推進し始めた。 社内 IT インフラ関連の作業を自動化するにあたって、いわゆる "スクリプティング" 言語の需要は以前からあった。 ビルドが要らず、ソースとビルド済みバイナリの二重管理が不要なスクリプティング言語は、小さな作業の自動化をガンガン推し進めるにあたって、大変やりやすい。 にもかかわらず PowerShell を敬遠していたのは、コード補完、いわゆる "インテリセンス" が備わったエディタ環境がなかったためだった。 それで F# スクリプトなどを活用していた歴史がある。 しかしそれも今は昔。 いざ覚悟を決めて現代の PowerShell を使ってみると... バリバリにインテリセンスが効く ではないか。 おかげさまで、今はすっかり PowerShell が大好きになってしまった :) 凄いと思ったインテリセンス その1PowerShell では、拡張子 .ps1 のファイルに PowerShell のコードを書いておくことで、その .ps1 ファイル名を指定することで実行できる。例えばテキストエディタで下記の内容を保存した foo.ps1 があるとすると、 echo "bar"PowerShell コンソールで「.\foo」と入力して Enter すれば、foo.ps1 が読み込み・実行され、コンソールに「bar」と表示される。 Windows OS/MS-DOS における古き良きバッチファイル (.bat) と同じようなものだ。 さてところで、PowerShell は近代のシェル環境・スクリプティング言語にふさわしく(?)、その .ps1 ファイルにおいてどのようなコマンドラインスイッチを受け付けるかを、.ps1 ファイルの冒頭で宣言できる。 具体的には param という構文を使う。 こんな感じ。 # foo.ps1冒頭の param 構文によって foo.ps1 は -Upper スイッチを持つことが宣言されている。 これにより、 >.\fooを実行すれば「bar」が、 >.\foo -Upperを実行すれば「BAR」がコンソールに表示される。 とまぁ、ここまでは PowerShell によるコマンドラインスイッチの解析の仕組みの話。 ここからが本題。 ここで、PowerShell コンソールで「.\foo」とまで入力して、半角スペース、ハイフンとまでタイプし、そこで Tab を打鍵すると... 「-Upper」と補完されるではないか! ちゃんと .ps1 ファイルの内容を先読みして、Tab 補完してくれるのだ。 上記の例ではスイッチがひとつだけだが、いくつもスイッチがある場合は、Tab キーを続けて打鍵することで候補が順繰り次々表示される。 また、PowerShell の純粋なコンソールではなく、「PowerShell ISE」という PowerShell 専用の「統合開発環境」みたいなツールにおけるコマンドウィンドウからだと、ハイフンを押した時点で、いわゆる "インテリセンス" として候補が GUI としてリスト表示される。 このように自作のシェルスクリプトファイルについても、コマンドラインスイッチの Tab 補完・インテリセンスが機能するのは大変便利だ。 自作のシェルスクリプトとはいえ、本数が結構増えてきたため、いちいちコマンドラインスイッチに何があるか覚えていられない。 なのでこの機能は大変便利である。 さすがの F# スクリプトでもここまでの芸当はできない。 凄いと思ったインテリセンス その2小さな作業の自動化のひとつに、Microsoft Word の自動化なども行っている。PowerShell から、COM、昔でいうところの ActiveX Automation 経由で MS Word を "自動操縦" して、自動化を果たすわけだ。 ちなみに、COM との相互運用は PowerShell に限らず、Windows OS 上で動作する様々な処理系で可能だ。 C# や C++、VB は然り、F# でもちろんのこと、さらには Windows 版の Ruby や Python にだってできる。 しかし PowerShell における COM との相互運用は、Tab 補完・インテリセンスの面においてほかの処理系とは一味違う。 ここでは PowerShell コンソール上で直接作業するのではなく、PowerShell ISE 上での話とする。 まず、Microsoft Word を COM 経由で起動する PowerShell コードは下記だ。 $msword = New-Object -Com "Word.Application"上記を PowerShell ISE のスクリプトエディタ(コマンドウィンドウではなく)に入力したとしよう。 ここで次の行で「$msword.」とドットまで打つと... まだ何も起きない。 上記コードで文字列で Microsoft Word の COM 世界における "ID" を指定していることからもお察しいただけるとおり、これはレイトバインディング(遅延バインディング、実行時解決)なのである。 基本原理として、ソースコード上に記されたメソッド名やプロパティ名を文字列として IDispacth.Invoke するだけなのだ。 (正確には DISPID を問い合わせて...という話になるのだが割愛) なので、インテリセンスが効かなくても無理はない。 ...と思いきや。 PowerShell ISE では、F8 キーによって、キャレットがある行や、選択範囲をコマンドウィンドウ上で実行することができる。 ということで、「$mswword = ...」の行を F8 でいったん実行してしまう。 代償(?)として、実際に Micorosft Word が起動されるのだが、その見返りに、なんと、 インテリセンスが機能し始めるのだ! ![]() コード上だけでは型情報を取りようのない遅延バインディングなコードでも、実際に PowerShell ISE 内で部分実行して、そのオブジェクトインスタンスが実体化すれば、そのオブジェクトに対して持ってるメンバを問い合わせして、インテリセンスを表示できる、という仕掛けなのだろう。 しかも PowerSell ISE が提供してくれるこのインテリセンス、 ツールチップで引数や戻り値の情報も表示 される。 このおかげで、Microsoft Office 系アプリの COM 経由での自動操縦を記述するには、F8 による部分実行しながら PowerShell コードを書き進めれば、ほかのドキュメント類を参照することなく多少うろ覚えであってもどんどん書き進められる。 まとめということで。その昔、PowerShell v1 をいじって「学習コストをかけたくない自分には、インテリセンスのない処理系は体にあわない」と思い込んでいた。 ところが、現代の PowerShell は下手な動的言語よりインテリセンスバリバリなので、これを活用しない手はないと思う次第であった。
by developer-adjust
| 2013-12-15 12:39
| その他IT系
|
Comments(0)
|
ファン申請 |
||