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

3.スクリプト機能の比較(1)

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

WSHとPowerShellの比較:スクリプトの機能面

 次に、スクリプト言語の機能の側面から比較してみよう。

比較ポイント「基本的なスクリプトを書くには」

WSH [VBScript] 関数の組み合わせ
[JScript] 内部オブジェクトの組み合わせ
PowerShell コマンドレットの組み合わせ

 WSHはVBScriptとJScriptで基本的なスクリプトを書く際の方法が異なる。VBScriptでは100種ほどある関数(ある処理を行い、その結果を返すための装置)を組み合わせて基本的なスクリプトを組むことができる。JScriptではさまざまな内部オブジェクト(便利な機能を実現するための道具)のプロパティ(属性)やメソッド(動作)を組み合わせてスクリプトを組む。

 それに対しPowerShellでは、コマンドレットと呼ばれる統一化された呼び出し方法を備えた120種以上のコマンドをパイプや変数を通して組み合わせて利用するのが基本的な使い方となる。

 ここで、サンプルとしてそれぞれの言語で現在の時間を表示させるスクリプトを取り上げてみよう。

 これらのスクリプトはそれぞれ、VBScriptでは拡張子.vbsを、JScriptでは拡張子.jsを、PowerShellでは拡張子.ps1を付けてテキスト形式で保存する。VBScriptとJScriptのスクリプト・ファイルは、エクスプローラ上でダブル・クリックすることで実行可能である。また、PowerShellのスクリプト・ファイルは、デフォルトのスクリプト実行ポリシーでは実行が許可されていないので、PowerShellを実行し、Set-ExecutionPolicyコマンドレットを使用し適切な実行ポリシーを設定する必要がある(以下の実行例を参照のこと。この作業は最初の1回のみでよい)。その後、スクリプト・ファイルのフルパスを入力するか、カレント・ディレクトリをスクリプト・ファイルのあるフォルダにし(これはSet-Locationコマンドレットを用いて行う。エイリアスのcdを使ってもよい)、そこで「.\<スクリプト・ファイル名>.ps1」のように入力し、[Enter]キーを押すと実行される。

■VBScript
※ファイル:gettime.vbs

MsgBox(Now()) 'MsgBox関数でNow関数の戻り値を表示する。

VBScriptによる実行例
■JScript
※ファイル:gettime.js

var d = new Date(); // Dateオブジェクト作成
WScript.Echo (d.toLocaleString()); // DateオブジェクトのtoLocaleStringメソッドを実行し、WScriptオブジェクト()のEchoメソッドで表示

* 厳密にはWScriptオブジェクトはJScriptの内部オブジェクトではなく、WSHのオブジェクトである。

JScriptによる実行例
■PowerShell
※ファイル:gettime.ps1

Get-Date #Get-Dateコマンドレットを利用して現在時刻を表示する。

PowerShellによる実行例
PowerShellのスクリプトは「.PS1(末尾の文字は数字の1)」という拡張子の付いたファイルに保存することになっている。ただし、デフォルトではスクリプトの実行は禁止されているので、セキュリティ設定を変更しておく必要がある。
  Set-Locationコマンドレットを用い、カレント・ディレクトリをスクリプト・ファイルの存在するフォルダに設定する(エイリアスのcdでも可能)。
  Get-Contentコマンドレットで、実行するスクリプト・ファイルgettime.ps1の内容を確認してみる(エイリアスのtypeでも可能)。
  このスクリプトを実行しようとして、「.\gettime.ps1」のように入力して[Enter]キーを押しても、デフォルトでは実行できず、このように、スクリプトの実行が禁止されているというエラー・メッセージが表示される。
  Get-ExecutionPolicyコマンドレットでスクリプト実行ポリシーを確認すると、「Restricted(すべてのスクリプトの実行を禁止)」であることが分かる。
  そこで、Set-ExecutionPolicyコマンドレットを用い、スクリプト実行ポリシーを「RemoteSigned(リモートにあるスクリプト・ファイルに対しては実行に署名が必要、ローカルのスクリプト・ファイルには必要なし)」に設定する。
  Get-ExecutionPolicyコマンドレットを再度実行すると、スクリプト実行ポリシーがRemoteSignedに変更されていることが分かる。
  再度.\gettime.ps1を実行してみると、今度はスクリプトが実行され、結果が表示されている。一度スクリプト実行ポリシーを設定しておけば、次からはスクリプトの実行が可能になる。

 なお、補足となるが、VBScriptの関数で実現していた機能を、PowerShellのコマンドレットで実現するにはどのように記述するかを示したWebページが存在するので参照するのもいいだろう(「Converting VBScript Commands to Windows PowerShell Commands[英語](TechNetサイト)」)。

―――― ◆ ――――

比較ポイント「応用的なスクリプトを記述するには」

WSH 使用するクラス・ライブラリはCOM
PowerShell 使用するクラス・ライブラリは.NET FrameworkとCOM

 スクリプト言語の機能だけではカバーできない応用的なスクリプトを書く際、WSHではVBScriptでもJScriptでも、WSHの提供する、あるいはほかのアプリケーション(Internet Explorer、Officeなど)の提供するCOM(部品化されたプログラムを作成・利用するための技術)のクラス・ライブラリ(オブジェクトのひな型となるもの(クラス)が多く含まれたファイル)が持つCOMオブジェクトを利用する。一方PowerShellでは、COMオブジェクトも使用可能なうえ、.NET Frameworkという膨大なクラスを持つクラス・ライブラリを利用し、.NETオブジェクトが使用できる。

 ここで、サンプルとしてShift-JIS文字コードで書かれたテキスト・ファイル(C:\test.txt)に、「悪霊退散」という文字列を書き込む例をそれぞれのスクリプト言語で作成してみよう。

■VBScript
※ファイル:akuryou.vbs

Option Explicit
'Scripting.FileSystemObjectオブジェクトを格納する変数を宣言
Dim objFSO
'CreateObject関数を使いScripting.FileSystemObjectオブジェクトを作成し、
'objFSO変数に格納
Set objFSO = CreateObject("Scripting.FileSystemObject")

'TextStreamオブジェクトを格納する変数を宣言
Dim objTextStream
'Scripting.FileSystemObjectオブジェクトのCreateTextFileメソッドを呼び出し、
'ファイルを作成すると同時に、戻り値であるTextStreamオブジェクトを変数objTextStreamに格納
Set objTextStream = objFSO.CreateTextFile("C:\test.txt", True, False)

'TextStreamオブジェクトのWriteメソッドを使い文字列を書き込む
objTextStream.Write "悪霊退散"
'TextStreamオブジェクトのCloseメソッドを使いファイルを閉じる
objTextStream.Close

'objTextStream、objFSOオブジェクト変数の解放
Set objTextStream = Nothing
Set objFSO = Nothing

■JScript
※ファイル:akuryou.js

//objFSO変数を宣言し、Scripting.FileSystemObjectオブジェクトを作成し、変数に格納
var objFSO = new ActiveXObject("Scripting.FileSystemObject");

//Scripting.FileSystemObjectオブジェクトのCreateTextFileメソッドを呼び出し、
//ファイルを作成すると同時に、戻り値であるTextStreamオブジェクトを変数objTextStreamに格納
var objTextStream = objFSO.CreateTextFile("C:\\test.txt", true, false);

//TextStreamオブジェクトのWriteメソッドを使い文字列を書き込む
objTextStream.Write("悪霊退散");
//TextStreamオブジェクトのCloseメソッドを使いファイルを閉じる
objTextStream.Close();

■PowerShell
※ファイル:akuryou.ps1

# System.Text名前空間にあるEncodingクラスの静的メソッドGetEncodingを呼び出す
# Shift-JISのDBCSCodePageEncodingオブジェクトが変数に格納される
$encoding = [System.Text.Encoding]::GetEncoding("Shift_JIS")

# New-Objectコマンドレットを使い、System.IO名前空間にある
# StreamWriterクラスをインスタンス化
# コンストラクタにファイル名やエンコードなどを指定
$streamwriter = New-Object `
    -typeName System.IO.StreamWriter `
    -argumentList "C:\test.txt", $false, $encoding

# StreamWriterオブジェクトのWriteメソッドを使い、文字列を書き込む
$streamwriter.Write("悪霊退散")
# StreamWriterオブジェクトのCloseメソッドを使い、ファイルを閉じる
$streamwriter.Close()

※ここでは説明のために.NET Frameworkのオブジェクトを使ったが、実際は次のようにOut-Fileコマンドレットを使い、1行で記述することもできる。

"悪霊退散" | Out-File -Encoding default -FilePath C:\test.txt

 また、VBScriptやJScriptのようにFileSystemObjectオブジェクトを呼び出すことも可能である。

 スクリプト言語によって使用するオブジェクトやクラス・ライブラリは異なるものの、同様の結果が得られる。オブジェクトの仕様によって使い方が少し異なるが、大まかな流れは同様であるといえる。


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


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間