Windows TIPS
[Scripting]
  Windows TIPS TOPへ
Windows TIPS全リストへ

WSHで名前付き引数と名前なし引数を扱う

解説をスキップして操作方法を読む

山田 祥寛
2004/12/11
 
対象OS
Windows NT
Windows 2000
Windows XP
Windows Server 2003
アプリケーション(コマンド)に対して引き渡すことができる引数は、「名前付き引数」と「名前なし引数」の2つに分類することができる。
WSHスクリプトでは、WshNamedとWshUnnamedオブジェクトを介することで、これら2種類の引数を取得することができる。
 
解説

 引数とは、コマンドやプログラムを呼び出すときに指定する入力値のことをいう。同義語として「パラメータ」という言葉を使用する場合もあるだろう。プログラム側では、引数として指定された値によって自身の挙動を切り替えたり、指定された値を利用して何かしらの演算を行ったりするというわけだ。

 例えばコマンド・プロンプト上で利用可能なコマンドの代表的な例として、ファイル名やフォルダ名の一覧を表示するdirコマンドがある。もしもC:とD:ドライブの直下に存在するファイルのみを拡張子順にソートして出力したい場合には、次のように指定すればよい。

C:\>dir c:\ d:\ /A:-D /O:E

 ここで、「c:\」と「d:\」が名前なし引数、「/A:-D」と「/O:E」が名前付き引数だ。名前なし引数ではdirコマンドで出力したい対象のパスを指定し、「/A」パラメータは出力したいファイルの属性、「/O」パラメータはソート・キーをそれぞれ指定している(dirコマンドに関する詳細は、Windows TIPS「dirコマンドでファイル名の一覧を取得する」を参照いただきたい)。

 WSH(Windows Script Host)でも、実行時にこれら名前付き引数と名前なし引数とを受け取る方法が提供されている。本TIPSでは、2種類のパラメータをWSHスクリプト上で利用する方法について紹介する。


操作方法

名前なし引数を利用する

 WSHスクリプトに対して名前なし引数を渡すには2つの方法がある。1つは、上の解説のようにコマンド・プロンプトから指定する方法、もう1つはWSHスクリプトにファイル名やフォルダ名をドラッグ&ドロップする方法だ。後者の方法を用いた場合には、ドラッグ&ドロップされたファイルのパス名が名前なし引数としてWSHスクリプトに引き渡される。

 このようにして引き渡された名前なし引数は、WshUnnamedオブジェクトを介して取得することができる。以下に名前なし引数を利用した例を示す。これは、任意のフォルダを指定することで、そのフォルダに含まれるファイルの一覧をoutput.txtに出力するというものである。

※ファイル echo.wsf

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
  <job id="Echo">
  <?job error="true" debug="true" ?>
  <object id="objFs" progid="Scripting.FileSystemObject" />
  <script language="VBScript">
  <![CDATA[
  ' テキストファイルoutput.txtを作成
  Set objOut=objFs.CreateTextFile("c:\output.txt",True)
  ' 名前なし引数をWshUnnamedオブジェクトとして取得
  Set objArgs=WScript.Arguments.Unnamed
  ' 名前なし引数(ここではフォルダのパス)を順番に取得し、
  ' 配下に含まれるファイルのパスを順番にoutput.txtに出力
  For i=0 To objArgs.Count-1
    For Each objFl In objFs.GetFolder(objArgs.Item(i)).Files
      objOut.WriteLine(objFl.Path)
    Next
  Next
  objOut.Close()
  ]]>
  </script>
  </job>
</package>
  • サンプル・ファイルのダウンロード
    :サンプル・ファイルecho.wsfをダウンロードするには、上のリンクを右クリックしてecho.wsfというファイル名で保存する)

 サンプルの詳細はコード内のコメントをご覧いただくとして、ここでは名前なし引数を取得している部分に注目してみよう(赤字の部分)。名前なし引数を取得するには、WScript.Arguments.Unnamedプロパティを介して、WshUnnamedオブジェクトを取得すればよい。WshUnnamedオブジェクトには、WSHスクリプトに対して渡された名前なし引数のセットが含まれており、Countプロパティで名前なし引数の数を、Itemプロパティでn番目の名前なし引数を、それぞれ取得することができる。

 echo.wsfを実行するには、エクスプローラなどからecho.wsfに対して任意のフォルダ(複数指定可)をドラッグ&ドロップすればよい。フォルダに含まれるファイルがリストとしてoutput.txtに出力されれば成功だ。

名前付き引数を利用する

 次に、WSHスクリプトで名前付き引数を受け取る方法について見てみよう。WSHで名前付き引数を管理するのはWshNamedオブジェクトの役割だ。以下に名前付き引数を利用した例を示す。これは、任意のファイルを指定された文字コードに変換するためのWSHスクリプトだ。kconv.wsfについては、Windows TIPS「ファイルの文字コードを変換する」でも紹介しているが、本稿では文字コードの指定を名前付き引数でユーザーが明示的に指定できるように変更している。

※ファイルkconv.wsf

<?xml version="1.0" encoding="Shift_JIS" standalone="yes" ?>
<package>
<job id="KConvert">
<?job error="True" debug="True" ?>
<object id="objBsp" progid="Basp21" />
<object id="objFs"  progid="Scripting.FileSystemObject" />
<script language="VBScript">
<![CDATA[
Sub FileConvert(objArg)
  Set objFld=objFs.GetFolder(objArg.Item("folder"))
  For Each objFl In objFld.Files
    strTmp=objFl.Path
    If objFl.Size>0 Then objBsp.KconvFile strTmp,strTmp & ".tmp",objArg.Item("out"),objArg.Item("in")
    objFl.Delete
    objFs.MoveFile strTmp & ".tmp",strTmp
  Next
  For Each objSub In objFld.SubFolders
    FileConvert objSub.Path
  Next
End Sub
FileConvert WScript.Arguments.Named
]]>
</script>
</job>
</package>
  • サンプル・ファイルのダウンロード
    :サンプル・ファイルkconv.wsfをダウンロードするには、上のリンクを右クリックしてkconv.wsfというファイル名で保存する)

 サンプルの詳細は先ほどのWindows TIPS記事をご覧いただくとして、ここでは名前付き引数を取得している部分に注目してみよう(赤字の部分)。名前付き引数を取得するには、WScript.Arguments.Namedプロパティを介して、WshNamedオブジェクトを取得すればよい。WshNamedオブジェクトには、WSHスクリプトに対して渡された名前付き引数のセットが含まれており、Countプロパティで名前付き引数の数を、Itemプロパティで指定された名前の引数値を、それぞれ取得することができる。

 kconv.wsfを実行するには、コマンド・プロンプトから以下のようなコマンドを入力する(本サンプルを利用するには、あらかじめBasp21コンポーネントをインストールしておく必要がある。インストール方法については、Windows TIPS「ファイルの文字コードを変換する」を参照のこと)。

C:\>kconv.wsf /folder:c:\sample /out:2 /in:1

 それぞれの名前付き引数の意味は以下のとおりである。

引数名 概要
/folder 文字コードを変換する対象となるフォルダ
/out 変換後の文字コード
/in 変換前の文字コード
kconv.wsfで利用可能な引数
/out、/inパラメータで指定可能な値については、Windows TIPS「ファイルの文字コードを変換する」を参照のこと。

 実行した結果、「c:\sample」フォルダ内のファイルがShift_JISからEUC-JPに変換されていれば成功だ。

 以上、名前なし引数と名前付き引数とをWSHスクリプトから操作する方法について見てきたが、構文的には「こういう場合には必ずこちらを使わなければならない」という規則はない。ただ、コード上での扱いやすさ、エンド・ユーザによる指定のしやすさを考慮すれば、両者はそれぞれの特性によって使い分けることが好ましい。名前付き引数と名前なし引数の使い分けについては、別稿の「Windows管理者のためのWindows Script Host入門 第4回」で詳説しているので、併せてご覧いただきたい。End of Article

「Windows TIPS」


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

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間