Hey, Scripting Guy!

Hey, Scripting Guy!

TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。

Hey, Scripting Guy! アーカイブも忘れずにチェックしてください。

今日の質問 : Ping や Ipconfig などのツールの実行後にコマンド ウィンドウを開いたままにする方法はありますか


コマンド ライン ツールの実行後にコマンド ウィンドウを開いたままにする方法はありますか

Q

Scripting Guy さん、よろしくお願いします。Ping や Ipconfig などのツールの実行後にコマンド ウィンドウを開いたままにする方法はありますか。

-- DB

A

DB さん、こんにちは。DB さんからの質問で、ある記憶が蘇ってきました。Scripting Guys の 1 人が Microsoft でこの仕事を始めた当初、WMI および ADSI は、スクリプト作成者にとって非常に使いにくいという意見が多数ありました。その結果、この Scripting Guy は WMI や ADSI を使う気になれなくなり、その代わりに、コマンド ライン ツールを呼び出す方法として VBScript を使用する必要性に迫られました。実際、 この Scripting Guy がまとめた最初の章が、「Microsoft Windows 2000 Scripting Guide」(英語) の基礎となり、またイベント ログ管理を取り上げた初の章となりました。また、この章にはスクリプト コードがどこにもありませんでした。

そうです。スクリプト コードがまったく含まれていないスクリプト ガイドを作成しようなどというのは、Scripting Guy ぐらいしかいません。

結局、持てる限りの説得力を駆使し、読者の同情を買う戦略で Scripting Guys は、「Microsoft Windows 2000 Scripting Guide」で紹介されているスクリプトがたった 1 つや 2 つでもいいじゃないかという、皆様のお目こぼしをいただくのに成功したといえるでしょう。その後、Scripting Guys もスクリプト内からコマンド ライン ツールを呼び出す方法について少しは学習したつもりです。だからこそ、ここでこうして質問に答えられるのです。

ところで、DB さんが求めているのは、Ipconfig.exe というコマンド ライン ツールを実行する次のようなスクリプトでしょうか。

Set objShell = CreateObject("Wscript.Shell")
objShell.Run("ipconfig /all")

確かに、このスクリプトは悪くありません。コマンド ウィンドウがポップアップし、Ipconfig が実行されます。唯一の問題は、IPconfig が返した情報を読み取れないうちにコマンド ウィンドウが閉じてしまうことです (非常に速く読めるというなら別ですが)。これでは困ります。

それでは、これをどのように修正すればよいのでしょうか。次にその方法を示します。

Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k ipconfig /all")

ご覧のように、次の改良スクリプトは、元のスクリプトと同じ基本構造を持っています。Wscript.Shell オブジェクトのインスタンスを作成し、その後で Run メソッドを呼び出して実際にコマンド ライン ツールを実行するという構造です。違いは、コマンド ライン ツールを呼び出す方法です。元のスクリプトではツール自体を単純に呼び出す方法を採用していましたが、

objShell.Run("ipconfig /all")

この改良スクリプトではまったく異なる構文を使用します。

objShell.Run("%comspec% /k ipconfig /all")

環境変数 %comspec% は Windows コマンド シェルを表し、 通常は Cmd.exe を呼び出す (これによりコマンド ウィンドウを開く) ことと同等です。なぜ単純に Cmd.exe を呼び出さないのかというと...。Windows 98 が動作するコンピュータがあるとしましょう。Windows 98 コンピュータでは、コマンド シェルは Command.com を実行することによって呼び出されます。つまり、Cmd.exe はありません。%comspec% を使用すると、スクリプトを実行する Windows のバージョンに関係なくコマンド ウィンドウを表示できます。

つまり、このスクリプトで Ipconfig を直接実行するわけにはいきません。その代わり、コマンド シェルのインスタンスを実行し、そのインスタンスに複数のパラメータを渡すわけです。最初のパラメータは /k で、実行する処理をコマンド シェルに伝え、コマンド ウィンドウを開いたままにするように指示します。ちなみに、k は keep、すなわち "keep open (開いておく)" の省略形であると言われていますが、真相のほどはわかりません。あるいは、タスクの完了と同時に自動的にコマンド ウィンドウを閉じるパラメータ /c (close(閉じる) の c) を使用してもかまいません。

他にもコマンド シェルに渡すパラメータはあるでしょうか。IPconfig を実行する ipconfig /all コマンドがあります。Ping.exe を使用して IP アドレス 192.168.1.1 で ping を実行したいなら、次のスクリプトを使用してください。このスクリプトは ping だけでなく、コマンド ウィンドウを開いた状態にします。

Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k ping 192.168.1.1")

Net.exe を実行してローカル ユーザー アカウントの一覧を取得して表示したいのですね。わかりました。

Set objShell = CreateObject("Wscript.Shell")
objShell.Run("%comspec% /k net user")

だんだん、わかってきていただけたと思います。

スクリプトでコマンド ライン ツールを使う機会を増やしたい (この際、簡単で優れた方法を活用するのに遠慮は要りません) なら、 コマンド ウィンドウ タイトルとコマンド ウィンドウ カラーの両方を変更する方法について説明した、このコラムを参考にしてください。Scripting Guy はいまだに、コマンド ライン ツールを呼び出すスクリプトが不得手です。スクリプトが掲載されていないスクリプト ガイドなど作るのではなかったと反省の日々です。


関連情報

Hey, Scripting Guy!- アーカイブもチェックしてください。

ページのトップへページのトップへ