Lesson12 ネットワークとコマンドラインオプション
WScriptのオブジェクト2 -WshNetworkオブジェクト・WshArgumentsオブジェクト-
さて今回は、WScriptオブジェクトのオブジェクトという「くくり」で、WshNetworkオブジェクトとWshArgumentsオブジェクトという全然相関性のない機能をもつ2つのオブジェクトを強引にまとめて解説してしまいます。
まずはWshNetworkオブジェクトです。このオブジェクトは文字通りネットワーク関係の操作をおこなうための機能を提供します。スタンドアローンでPCを利用している私にはもっとも縁遠いオブジェクトと言えるでしょう(今まで使ったことすらない)。このオブジェクトはNTのログオンスクリプトで使われることを強く意識した機能を持っていますが、Win9xでもネットワークを組んでいる方には便利に使えるのでしょう。たぶん…。
というか、このオブジェクトは私には解説不能のような気がしてきました。大丈夫かな?
以下のスクリプトを見てください。
Set WSHNetwork = WScript.CreateObject("WScript.Network") str = "コンピュータ名=" & WSHNetwork.ComputerName & vbCrLf str = str & "ユーザー ドメイン名=" & WSHNetwork.UserDomain & vbCrLf str = str & "ユーザー名=" & WSHNetwork.UserName MsgBox str
これは、たぶんネットワークにログオンしたユーザーの情報を表示するであろうスクリプトです。
1行目でWshNetworkオブジェクトを作成し、以下の行でその各プロパティを参照しています。
このスクリプトは、ネットワークに接続していない時点で実行すると、実行時エラーが発生して終了してしまいます。
次にWshNetworkオブジェクトのメソッドですが、まずその効果を表にまとめてみます。
対象 | 機能 | メソッド |
---|---|---|
ネットワークドライブ | 接続 | MapNetworkDrive |
切断 | RemoveNetworkDrive | |
情報の取得 | EnumNetworkDrives | |
ネットワークプリンタ | 接続 | AddPrinterConnection |
切断 | RemovePrinterConnection | |
情報の取得 | EnumPrinterConnections | |
デフォルトプリンタの設定 | SetDefaultPrinter |
このように、WshNetworkオブジェクトを利用すると、ネットワークドライブ・プリンタに対して、接続・切断・情報の取得が可能になります。
それではWshNetworkオブジェクトのメソッドを利用したスクリプトを書いてみます。ただし動作未確認ですが。
On Error Resume Next Dim str '各種定数の指定 Const strDrive="Z:" 'ドライブ名 Const strShare="\\Server\Share" '共有ポイント Const strPort="LPT1" 'ローカルのプリンタポート Const strPrinter="\\Server\Print1" 'プリンタ名 Const strUserName="UserName" 'ユーザー名 Const strPassword="Password" 'パスワード Set WSHNetwork = WScript.CreateObject("WScript.Network") 'WshNetworkオブジェクト作成 WSHNetwork.MapNetworkDrive strDrive,strShare,False,strUserName,strPassword 'MapNetworkDriveメソッド 'ネットワークドライブを接続する。 '第一引数=接続するドライブ名 '第二引数=共有ポイント '第三引数=マップ情報をユーザープロファイルに保存するか否か(省略可) '第四引数=カレント ユーザー以外のユーザーのクレデンシャルを使用して共有ポイントをマップする場合 ' 指定するユーザー名(省略可) '第五引数=そのパスワード(省略可) MsgBox strDrive & "をネットワークドライブに割り当てました。" Set objDrives=WSHNetwork.EnumNetworkDrives 'EnumNetworkDrivesメソッド 'ネットワークドライブの情報を格納した、WshCollectionオブジェクトを返す。 str="" For I=0 To objDrives.Count-1 Step 2 'Countプロパティには、要素の総数が格納されている。 str=str & objDrives.Item(I) & " " & objDrives.Item(I+1) & vbCrLf 'ネットワークドライブを格納したWSHCollectionのItemプロパティ(既定)は、 '偶数引数にドライブ名、奇数引数に共有名が格納されている。 Next MsgBox str,,"ネットワークドライブのマップ状況" WSHNetwork.RemoveNetworkDrive strDrive,False,False 'RemoveNetworkDriveメソッド 'ネットワークドライブを切断 '第一引数=切断するドライブ名 '第二引数=リソースが使用されていても切断するかどうか(省略可) '第三引数=マップ情報をユーザープロファイルに保存するか否か(省略可) 'ローカルのドライブ名がマップされていない場合は、NET USEコマンドを併用して '共有ポイント名を第一引数に指定できます。 MsgBox strDrive & "を切断しました。" WSHNetwork.AddPrinterConnection strPort,strPrinter,False,strUserName,strPassword 'AddPrinterConnectionメソッド 'ネットワークプリンタを接続する。 '第一引数=接続するポート '第二引数=プリンタ名 '第三引数=マップ情報をユーザープロファイルに保存するか否か(省略可) '第四引数=カレント ユーザー以外のユーザーのクレデンシャルを使用してプリンタをマップする場合 ' 指定するユーザー名(省略可) '第五引数=そのパスワード(省略可) WSHNetwork.SetDefaultPrinter strPrinter 'SetDefaultPrinterメソッド 'デフォルトプリンタを設定 '第一引数=プリンタ名(ポート名は指定できない) MsgBox strPort & "にネットワークプリンタを割り当てました。" Set objPrinters=WSHNetwork.EnumPrinterConnections 'EnumPrinterConnectionsメソッド 'ネットワークプリンタの情報を格納した、WshCollectionオブジェクトを返す。 str="" For I=0 To objPrinters.Count-1 Step 2 str=str & objPrinters.Item(I) & " " & objPrinters.Item(I+1) & vbCrLf Next MsgBox str,,"ネットワークプリンタのマップ状況" WSHNetwork.RemovePrinterConnection strPort,False,False 'RemovePrinterConnectionメソッド 'ネットワークプリンタを切断 '第一引数=切断するポート名 '第二引数=リソースが使用されていても切断するかどうか(省略可) '第三引数=マップ情報をユーザープロファイルに保存するか否か(省略可) 'ローカルのポート名がマップされていない場合は、NET USEコマンドを併用して 'プリンタ名を第一引数に指定できます。 MsgBox strPort & "を切断しました。"
…かなり長くなってしまいましたが、メソッドの基本的な使い方を列挙しました。
前半部分でネットワークドライブの接続、情報表示、切断を、後半部分でネットワークプリンタの接続、情報表示、切断をおこなっています。
このスクリプトの詳細は、コメント行をお読みください。用語については仕様書などのものをそのまま使用しているだけなので、不適切な使い方をしている可能性はあります(^^;
#クレデンシャルってなんだろう?
このスクリプトで、EnumPrinterConnectionとEnumNetworkDrivesメソッドの返値は、WshCollectionオブジェクトという特殊なオブジェクトであることに注目してください。
このオブジェクトは、複数の文字列情報を持つ、汎用的なオブジェクトです。WshCollectionオブジェクトは、Countプロパティで文字列の総数を、Itemプロパティで各文字列を取り出せます。なお、Itemプロパティは既定プロパティなので省略ができます。
WshNetworkオブジェクトのこの2つのメソッドでは、Itemプロパティの偶数番号にドライブ名(ポート名)、奇数番号に共有ポイント(プリンタ名)が格納されているので、情報を取り出すには上のスクリプトのように、ForステートメントでStep
2を指定する必要があります。つまり
obj.Item(0)="一つ目のドライブ名" obj.Item(1)="一つ目の共有ポイント" obj.Item(2)="二つ目のドライブ名" obj.Item(3)="二つ目の共有ポイント" ...
となっているわけです。
WshNetworkオブジェクトに関しては、WSH付属サンプル(network.vbs)にかなり参考になるスクリプトがありますのでそちらも参照してください。このスクリプトは割と複雑なので、理解を助けるためにコメント行を付加する差分スクリプトのようなものを作成したのでご利用ください。(セキュリティの関係上、念のためlzhで圧縮しています)
さて、苦労したWshNetworkオブジェクトの説明はこれで終わりまして、次にWshArgumentsオブジェクトの解説にまいります。
Set WSHArguments = WScript.Arguments If WSHArguments.Count > 0 Then For Each I In WSHArguments str=str & I & vbCrLf Next MsgBox str End If
このスクリプトは、オプションがある場合にそのオプションすべてを列挙します。
スクリプトにオプションをつけて実行してみてください。
(例) C:\nantoka.vbs aiueo kakikukeko sasisuseso (ファイル名を指定して実行)
wscript C:\nantoka.vbs aiueo kakikukeko sasisuseso
(DOSプロンプト)
WshArgumentsオブジェクトには、スクリプトファイルへのコマンドラインオプション(以下、単にオプションと記述)が格納されています。Countプロパティでオプションの総数が、Itemプロパティ(既定)で各オプションが参照できるのはWshCollectionオブジェクトと同様です。
上の例では、Countプロパティが0より大きいかどうかで、オプションの有無を判断しています。
WshArgumentsオブジェクトは、WshShellオブジェクトやWshNetworkオブジェクトは異なり、CreateObjectする必要はない(技術的なことを言うと、オートメーションオブジェクトではない、非公開のオブジェクト)ことにご注意ください。よって、Wscript.Arguments.Countとするだけでオプションの総数を取得できたりします。
WshArgumentsオブジェクトは、同一スクリプトでオプションによって動作を変えたいときに用います。実際は、ファイル名をオプションとして指定することで、そのファイルに何らかの操作を加えるスクリプトを書くときによく用います。
これでWScript関連のオブジェクトはすべて解説したことになります。次回からはいよいよ、ファイル操作をおこなう、FileSystemObjectオブジェクトについて取り上げます。WScript関連のオブジェクトを併用することでより実用的なスクリプトが作成できるので、次回に備えてここまでの復習をなさることをおすすめします(^^;