[運用]
Windowsスクリプティング環境比較:PowerShell vs WSH

4.スクリプト機能の比較(2)

Microsoft MVP
Visual Developer - Scripting
牟田口 大介
2007/04/12

比較ポイント「WMIの呼び出しは?」

WSH × WMIの呼び出しが面倒
PowerShell WMIの呼び出しが容易

 WindowsにはWMI(Windows Management Instrumentation)という、ソフトウェアやハードウェアを統一的に管理するための機能が存在する。WSHではWMIのCOMオブジェクトのコレクション(オブジェクトの集合)から構文を使ってそれぞれのオブジェクトを取り出し、必要なプロパティを取り出す、という煩雑な手順を踏むのが基本的な使い方だが、PowerShellにおいてはGet-WMIObjectというコマンドレットを使うことで、わずか数行で記述することができる。ここではシステムに含まれるディスク・ドライブ群の容量を列挙するスクリプトを組んでみよう。

■VBScript
※ファイル:wmidisk.vbs

Option Explicit
'SWbemServicesExオブジェクト、SWbemObjectSetコレクションを格納する変数を宣言
Dim objWbemServices, objWbemObjectSet

'SWbemServicesExオブジェクトを取得して変数に格納
Set objWbemServices = GetObject("winmgmts:\\.")
'SWbemServicesExオブジェクトのInstancesOfメソッドを使い
'Win32_DiskDrive(ディスクドライブの情報を格納したクラス)のコレクション
'(SWbemObjectSetコレクション)を得て変数に代入
Set objWbemObjectSet = objWbemServices.InstancesOf("Win32_DiskDrive")

'SWbemObjectExオブジェクトを格納する変数を宣言
Dim objWbemObject

'SWbemObjectSetコレクションの構成要素である、おのおののSWbemObjectExオブジェクトを取り出す
For Each objWbemObject In objWbemObjectSet
    'SWbemObjectExオブジェクトのSizeプロパティの値を参照し、表示
    WScript.Echo "ディスクのサイズ(bytes): " & objWbemObject.Size
Next

'オブジェクトの解放
Set objWbemServices = Nothing
Set objWbemObjectSet = Nothing

VBScriptによる実行例

■JScript
※ファイル:wmidisk.js

//SWbemServicesExオブジェクトを取得して変数に格納
var objWbemServices = GetObject("winmgmts:\\\\.");
//SWbemServicesExオブジェクトのInstancesOfメソッドを使い
//Win32_DiskDrive(ディスクドライブの情報を格納したクラス)のコレクション
//(SWbemObjectSetコレクション)を得て変数に代入
var objWbemObjectSet = objWbemServices.InstancesOf("Win32_DiskDrive");

//SWbemObjectSetコレクションの構成要素である、おのおののSWbemObjectExオブジェクトを取り出す
for(e = new Enumerator(objWbemObjectSet) ; !e.atEnd() ; e.moveNext())
{
    objWbemObject = e.item();
    //SWbemObjectExオブジェクトのSizeプロパティの値を参照し、表示
    WScript.Echo("ディスクのサイズ(bytes): " + objWbemObject.Size);
}

JScriptによる実行例

■PowerShell
※ファイル:wmidisk.ps1

# Get-WMIObjectコマンドレットを用い、Win32_DiskDriveクラスのインスタンスを変数に格納
$disks = Get-WMIObject -class Win32_DiskDrive
# パイプを通じ、コレクションの各要素を列挙する
$disks | ForEach-Object -process {Write-Host("ディスクのサイズ(bytes): " + $_.Size)}

PowerShellによる実行例

 WSHのVBScriptやJScriptのコードに比べると、PowerShellのコードがシンプルで簡潔なことがお分かりいただけると思う。

 このほかにもWSHではCOMオブジェクトを呼び出さないとファイルシステムやレジストリにアクセスできないが、PowerShellではそれぞれファイルシステム・プロバイダ、レジストリ・プロバイダが提供するコマンドレットを組み合わせることで容易にアクセスが可能だ。

WSHとPowerShell、どちらを使うべきか?

 ここまでの比較を振り返ってみると、現状ではアプリケーションの使い勝手としてはWSHが、スクリプト言語の機能面ではPowerShellが優位になると考えて差し支えないだろう。使い分けの決め手となるのは、システムにPowerShellなどを追加インストールできるか否かにかかっているといえるかもしれない。WSHならばどこででも動作するが、PowerShellはそうではないからだ。

 将来性に関していうと、WSHは今後セキュリティ対策やバグフィックスなどのためのマイナー・アップグレードのみにとどまり、メインとなる機能はさほど変化しないと考えられる。ある意味「枯れた」「安定した」環境である。あくまで予想だが、WSHはWSHで今後も長く使われるのではないかと思う(コマンド・プロンプト上で動作するバッチ・ファイルすらいまだ現役のところもあるくらいなのだから)。一方、PowerShellはまだリリースされたばかりで、今後さまざまな発展が予想される。また、さまざまな製品に、カスタマイズされたPSスナップイン(PowerShellを拡張するためのファイル。PSプロバイダやコマンドレットを含む)が同梱される予定である(Exchange Server 2007など)。

 また応用面に関していうと、WSHを学習することでVBScriptなら文法が似ているプログラミング開発言語であるVB.NETやマクロ言語であるOffice VBAなどへの移行もスムーズに行えるであろう。JScriptは最近のWebページで流行しているAJAXの構成言語であるJavaScriptと互換性があるので、こちらも覚えたことは無駄にならないだろう。また、VistaではWindows サイド・バーにガジェットと呼ばれる小さなプログラムを配置できるが、その記述言語はVBScript、JScript(JavaScript)である。すなわちWSHを覚えることで、最新技術に対してもさまざまな応用が利くといえる。その点に関してはPowerShellも同様で、PowerShellを学習すると、.NET系言語(VB.NET、C#など)が使用する.NET Frameworkに精通することができるという利点がある。

 これらを踏まえると、これからWindowsで動作するスクリプト言語を学ぼうとする方には、WSHとPowerShell、どちらを選んでもそれぞれメリットがあるので、筆者としては「こちらがお薦め!」とはいいにくいところがある。本音をいえば「両方お薦め!」である。ぜひとも、どちらの環境にも触れてみていただきたい。また、WSHをすでに使われている方は、ぜひ新しいPowerShellも使ってみていただきたいと思う。End of Article

 

 INDEX
  [運用]Windowsスクリプティング環境比較:PowerShell vs WSH
    1.PowerShellのインストールと動作確認
    2.アプリケーションとしての比較
    3.スクリプト機能の比較(1)
  4.スクリプト機能の比較(2)
 
 運用


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間