Silverlight をインストールするには、ここをクリックします
Japan変更|すべてのMicrosoft のサイト
Microsoft TechNet
|TechCenter|ダウンロード|TechNet プログラム|サブスクリプション|My TechNet|セキュリティ情報|TechNet アーカイブ|サイトマップ
サイトの検索


Hey, Scripting Guy!

Scripting Guys が皆さんの質問にお答えします

Hey, Scripting Guy!

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

詳細情報

Hey, Scripting Guy! カテゴリ別アーカイブ

Hey, Scripting Guy! 日付別アーカイブ

Hey, Scripting Guy! ダウンロード (英語)

Spacer

*

Ping コマンドの出力を変更する方法はありますか

Hey, Scripting Guy! Question

Scripting Guy さん、よろしくお願いします。Ping.exe の出力の各行頭に、現在の日時を配置する方法はありますか。

-- AL

SpacerHey, Scripting Guy! AnswerScript Center

こんにちは、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 行ずつ読み取っているだけです。

: 正直なところ、少しだけずるをしています。実際には、Ping を呼び出して、コマンドが終了するのを待機します。その後 (処理が終わって少したってから)、各行の先頭に日時を追加しています。つまり、時刻が常に数秒遅れているということです。しかし、それが実行できる最善の方法なのです。Ping に最初の ping を発行するよう指示して、結果を取得して日時を追加するのを待機してから、"ようやく" 2 番目の ping を実行できます。正確なレベルで取得する必要がある場合や、Windows XP または Windows Server 2003 を実行している場合は、WMI クラスの Win32_PingStatus を使用できます。つまり Ping.exe のカスタマイズ版を独自に作成できます。

ループの中で次のコード行を使用して、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

: ところで、何年も前に、かの有名な Dean Tsaltas が「Tales From the Script」のコラムを執筆していました。その中で、今回と同じ方法でコマンド ライン ツールから返される出力を変更する方法が紹介されています。興味をお持ちの方は、こちら (英語) を参照してください (ついでに言うと、これがスクリプト センターに初めて公開されたコラムでした。このコラムは、2002 年と変わらず現在も役立っています)。

AL さんのお役に立てばと思います。ただし、モナ リザに蝶のタトゥーを入れることに関してはお力になれそうにありません。

タトゥー
 

Microsoft