2017-05-13 1 views
2

最近、私のインターネット接続は本当に不満足なので、停止時間と停止時間についてはできるだけ多くのデータを収集しようとしています。私はいくつかの "コネクティビティモニタリング"プログラムを試しましたが、私が望むように動作しないので、私はそれを作ることにしました。バッチを使用したインターネット接続の確認

私はバッチ内の完全なnoobのだが、過去の時間のものをグーグルから私はこの思い付いた:

SET status=" 

:start_test 
timeout 5 
ping -n 2 -w 700 www.google.com | find "bytes=" 
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet. 

) ELSE (
    SET internet=Not connected to the internet. 
) 
IF %status%==%internet%(
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 
echo ------------------------------------------ 
echo %internet% 
@echo %time% 
echo ------------------------------------------ 
SET status=%internet% 
goto :start_test 

TL; DR-それはgoogle.comをピニングにより、インターネット接続を確認し、マッサージを書き込み毎回インターネット接続の状態が変化するたびに

それは動作しません私はそれを実行しようとすると、最初の数行を通過し、それ自体を閉じる理由を知らない。

ヘルプ

EDIT: それが機能するようになりました、これはファイルが(ちょうどMofiが言ったように)、今どのように見えるかです:

@echo off 
SET "status=" 

:start_test 
timeout 5 
ping -n 2 -w 700 www.google.com | find "bytes=" 
IF %ERRORLEVEL% EQU 0 (
    SET internet=Connected to the internet. 

) ELSE (
    SET internet=Not connected to the internet. 
) 
IF "%status%"=="%internet%" (
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 
echo ------------------------------------------ 
echo %internet% 
@echo %time% 
echo ------------------------------------------ 
SET "status=%internet%" 
goto :start_test 
+0

あなたは何を確認しているか注意する必要があります。これらのチェックでは、マシンがping情報を返しているかどうかだけが判断されます。それはなぜあなたに何も言わない。ルータのログとルータの設定を確認してください。あなたが投稿したスニペットの3つのものを変更する必要があります。 'SET status =" '' SET "status =" '、IF%status%==%インターネット%(' IF '%status% "= = "%internet%"( 'と' SET status =%インターネット%から 'SET"ステータス=%internet% "'。 – Compo

+0

あなたが編集したバージョンで行った変更はまさに3つの変更私はコメントしてくれました。その理由から、それはMofi **に信用するのは少し不公平です。 – Compo

答えて

0

Batch file comparison of variable with constant failsの答えは、デバッグする方法最初の章で説明しますではなく、をダブルクリックしますが、コマンドプロンプトウィンドウを開き、このウィンドウ内からバッチファイルを実行すると、バッチファイルの実行が終了するという構文エラーによるエラーメッセージが表示されます。


SET status=" 

この行は、値"と環境変数statusを定義します。

は、私はあなたがおそらく既存の環境変数statusを削除する

SET "status=" 

を使用していたと仮定していますが、最初の二重引用符を省略し、これは間違ってコード化されました。ターゲットのようなエラーに成功した場合に01ERRORLEVELを設定


コマンドPINGはpingを実行することができませんでした。

しかし、あなたはPINGの終了コードを評価し、代わりにPINGによってFINDの出力を解析し、FINDの終了コードを評価したくないいくつかの未知の理由のために。

FINDの使用はここでは完全に不要です。


FINDの終了コードの評価は既にこの終了コードに応じて、継続するために十分だろうが、スペースを持つ2つの異なる文字列がERRORLEVELの値に応じて環境変数に割り当てられています。


一つPINGの終了コードに多かれ少なかれ依存して分岐するために使用される場合以上。

構文エラーのためにバッチ実行を終了させて​​しまったあなたのミスがあります。

IF %status%==%internet%(

IF " == Connected to the internet. (

又は

IF " == Not connected to the internet. (

への最初の比較に膨張し、両方のラインがに構文エラーメッセージ出力によって示されるWindowsコマンドインタプリタによって正しく処理することができませんコマンド・プロンプト・ウィンドウ内からバッチ・ファイルが実行されるときに読み取られるコンソール。コマンドの区切り文字SPACEを含む文字列を比較する

は、二重引用符で比較すること、すなわち使用を両方の文字列を囲む必要があります。

IF "%status%" == "%internet%" (

しかし、たとえこれが原因で、環境変数statusで、ここで助けないだろうが、単一の二重引用符を使用して定義されます最後の文字列が最初の比較である"""になり、構文エラーが発生します。

注:二重引用符は、文字列の比較に含まれています。


以下のブロックも興味深い:

IF %status%==%internet%(
goto :start_test 
) ELSE (
goto :teller 
) 

:teller 

ELSE 分岐がELSE 分岐が全く存在しない場合は、任意の場合に実行される行にジャンプするためのものです。したがって、完全なELSEブランチはまったく必要ありません。

@echo off 
set "Status=2" 
:ConnectionTest 
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul 
if errorlevel 1 (
    if not "%Status%" == "1" echo %TIME% Not connected to the internet. 
    set "Status=1" 
) else (
    if not "%Status%" == "0" echo %TIME% Connected to the internet. 
    set "Status=0" 
) 
%SystemRoot%\System32\timeout.exe /T 5 >nul 
goto ConnectionTest 

それはすべて二重引用符や使用を省くためにここに可能でしょう:私は、バッチコードを簡素化するために提案し、上記のすべての理由から


@echo off 
set Status=2 
:ConnectionTest 
%SystemRoot%\System32\ping.exe -n 2 -w 700 www.google.com >nul 
if errorlevel 1 (
    if not %Status% == 1 echo %TIME% Not connected to the internet. 
    set Status=1 
) else (
    if not %Status% == 0 echo %TIME% Connected to the internet. 
    set Status=0 
) 
%SystemRoot%\System32\timeout.exe /T 5 >nul 
goto ConnectionTest 

理解のためにコマンドプロンプトウィンドウを開き、次のコマンドを実行し、コマンドごとに表示されているすべてのヘルプページを非常に注意深く読んでください。

  • echo /?
  • goto /?
  • if /?
  • ping /?
  • set /?
  • timeout /?

も読むに関するMicrosoftの記事。

関連する問題