Windows の管理用スクリプトは VBScript から PowerShell スクリプトの時代に変わっています。 PowerShell で書くスクリプトについてなかなか馴染めませんでしたが、最近ようやっとその理由がわかったので、同じような境遇の方へのヒントとなるようにまとめてみました。
PowerShell はコマンドレットの実行環境
まず私の犯した大きな間違いは PowerShell を VBScript のようにプログラミング言語と捉えてしまったことです。 VBScript の置き換えでこれまで通り各オブジェクトを操作するのだろうと考えてしまいました。
しかし、そう捉えてしまうのは誤りです。 そうではなくコマンドレットの実行環境と捉えるのが正しいです。 PowerShell はその名の通り、perl よりも sh の立場なのです。
そう捉えればスクリプトセンターのラーニング領域から探し出せるリファレンスっぽいものが「Windows PowerShell Quick Reference」とかいうたった 2ページのチープなガイドのみなのも納得できます。 Unix で sh の文法だけでなく各コマンドを知っていることも重要なように、「コマンドレット」の使い方を知っていないとまずいのです。 私は、スクリプトセンターで PowerShell の情報を探すよりもどのようなコマンドレットがあってそれぞれ何があるかを把握すべきだったのです。 コマンドレットのリファレンスはこちらにあります。
実行時に注意すること
先のリファレンスと同じサイトで提供されている「Getting Started」もざっと目を通しておくのがよいと思います。 特に気をつけねばならないのは必要なモジュールをインポートしないと目的のコマンドレットを使えないことがあるというところです。
例えば Active Directory を操作するスクリプトを書く場合は以下の一文が必要となるでしょう。
Import-Module ActiveDirectory
オブジェクトの操作
先の Quick Reference にも書いてありますが、.Net Framework のオブジェクトは [] で括ってつかいます。 static なメソッドはそのまま呼べますね。
$tmpText = [system.io.path]::GetTempFileName()
また PowerShell では .NET Framework クラスの名前空間は system になっているので、’system.’ を省略することもできます。
$tmpText = [io.path]::GetTempFileName()
オブジェクト生成であれば New-Object コマンドレットを使います。 以下は COM オブジェクトの例ですが、.NET Framework クラスであれば -TypeName パラメータを指定します。 詳しくはNew-Object のリファレンス参照ということで。
$ie = New-Object -COMObject InternetExplorer.Application $ie.Navigate2("www.microsoft.com") $ie.Visible = $true
いかがでしょう。 これでだいぶ PowerShell が身近になったのではないでしょうか? 特に管理用スクリプトはサンプルのコピペ実行では危険で、内容をきちんと理解し、修正できなければなりません。 結局は自分で手を動かして覚えていくしかないのですが、オブジェクトのリファレンスの他にコマンドレットのリファレンスを参照できるようになればかなり楽になると思います。