Hey, Scripting Guy!Scripting Guys が皆さんの質問にお答えしますTechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。 詳細情報
Ping コマンドの出力を変更する方法はありますかScripting Guy さん、よろしくお願いします。Ping.exe の出力の各行頭に、現在の日時を配置する方法はありますか。 こんにちは、AL さん。正直に言うと、あなたの質問には少しショックを受けました。Ping コマンドの出力を変更するですって。本当ですか、AL さん。『ロミオとジュリエット』のシナリオを、明るいハッピー エンドになるように書き換えてほしいのですか。"モナ リザ" を髪の毛がブロンドになるように描き換え、かわいらしい蝶のタトゥーを入れてほしいのですか。M&M’s ピーナッツ チョコレートからピーナッツを取り除いて大豆に換えてほしいのですか。手を加えてはならないものもあるのです。今例に挙げたものはそのままでいいのです。 でも、実を言うと、Scripting Guys は Ping.exe を手を加えてはならないものの 1 つとは思っていません。 Set objShell = CreateObject("WScript.Shell") Set objWshScriptExec = objShell.Exec("ping 192.168.1.1") Set objStdOut = objWshScriptExec.StdOut Do Until objStdOut.AtEndOfStream strLine = objStdOut.ReadLine If Len(strLine) > 2 Then WScript.Echo Now & " -- " & strLine Else Wscript.Echo strLine End If Loop ここでは何をしているのでしょうか。まず、Wscript.Shell オブジェクトのインスタンスを作成しています。次に、Shell オブジェクトの Exec メソッドを呼び出し、Exec にコマンド ライン コマンドの ping 192.168.1.1 を実行するように指示します。 Set objWshScriptExec = objShell.Exec("ping 192.168.1.1") (Windows Script Host Version 5.6 の一部として導入された) Exec メソッドになじみがない方のために説明しますと、このメソッドは、ちょっとしたものですが、実に気の利いたコマンドなのです。Exec は、Run メソッドと似ています。主な違いとして、Run メソッドは表示されているコマンド ウィンドウでコマンド ライン ツールを実行しますが、Exec メソッドは同じコマンド ライン ツールを非表示ウィンドウで実行します。Exec を使用して Ping.exe を呼び出すと、画面上に Ping (Ping の出力) が表示されません。 おっしゃるとおりです。結果が表示されないのなら、Ping はそれほど便利ではありませんよね。でも、心配はいりません。出力は表示されなくても取得できます。なぜって、Exec を使用してコマンド ライン ツールを実行すると、WSHScriptExec オブジェクト (Exec メソッドを呼び出すと同時に作成されるオブジェクト) の StdOut プロパティに出力がすべて保存されるからです。Ping.exe の出力を取得するには、単に StdOut プロパティの値を読み取るだけです。 さて、どんな方法で行うのかを考えてみましょう。まず、次のコードを使用して StdOut プロパティにバインドします。 Set objStdOut = objWshScriptExec.StdOut 接続を確立したら、StdOut を、読み取る行がなくなるまで (つまり、AtEndOfStream プロパティが True になるまで) 1 行ずつ読み取る Do Until ループを設定します。確かに、StdOut を 1 行ずつ読み取る必要はありません。この場合、現在の日時を各行の先頭に配置するために、1 行ずつ読み取っているだけです。
ループの中で次のコード行を使用して、StdOut から 1 行目を読み取ります。 strLine = objStdOut.ReadLine その後、Len 関数を使用して、この行に 3 文字以上の文字が含まれているかどうかを判断します。なぜでしょうか。通常、Ping の出力には空白行がいくつか含まれます。空白行に現在の日時を追加したくないため、少し高度なプログラミングを使用して空白行を除外します。では、なぜ "3" つ以上の文字が含まれる行を調べるのでしょうか。含まれる文字数が 0 の行を調べるべきではないでしょうか。 それなら理解できます。ただし、コマンド ライン出力で空白行に含まれている文字数は、実は 0 ではありません。実際は、空白行には 2 文字含まれています。その 2 文字とは、改行 ("carriage return" と "linefeed") のことです。文字の長さが 0 に等しい行を調べたとしたら、1 つも検出されないでしょう。 検出される行は、3 文字以上含まれている行と考えてください。検出された場合、(VBScript 関数の Now を使用して) 現在の日時をエコー バックし、続いて StdOut から読み取ったコード行をエコー バックします。 WScript.Echo Now & " -- " & strLine 3 文字以上含まれない場合、その行は空白行ということになります。その場合、現在の日時は追加しませんが、StdOut から読み取った値のみをエコー バックします。 Wscript.Echo strLine これでうまくいきますね。ご自分で確かめてください。 8/6/2006 2:42:45 PM -- Pinging 192.168.1.1 with 32 bytes of data: 8/6/2006 2:42:45 PM -- Reply from 192.168.1.1: bytes=32 time<1ms TTL=128 8/6/2006 2:42:46 PM -- Reply from 192.168.1.1: bytes=32 time<1ms TTL=128 8/6/2006 2:42:47 PM -- Reply from 192.168.1.1: bytes=32 time<1ms TTL=128 8/6/2006 2:42:48 PM -- Reply from 192.168.1.1: bytes=32 time<1ms TTL=128 8/6/2006 2:42:48 PM -- Ping statistics for 192.168.1.1: 8/6/2006 2:42:48 PM -- Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 8/6/2006 2:42:48 PM -- Approximate round trip times in milli-seconds: 8/6/2006 2:42:48 PM -- Minimum = 0ms, Maximum = 0ms, Average = 0ms
AL さんのお役に立てばと思います。ただし、モナ リザに蝶のタトゥーを入れることに関してはお力になれそうにありません。 |