none
netshとrouteをバッチで組み合わせて使う場合うまく動作しません RRS feed

  • 質問

  • netshとrouteをバッチで組み合わせて使うとうまく行かない場合があるように見えます。うまく行かないケースは下記のような場合です。

    ここで接続のデフォルトゲートウェイ設定欄は空欄にしてあります。以下は全て管理者権限での実行です。

    route add 0.0.0.0 mask 0.0.0.0 192.168.0.254

    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0

    とするとroute addの方が動作しないように見えます。

    この時初めからアドレスとして192.168.0.1ではなく192.168.0.2などがセットされているような場合でもです。

    これはもしかしてnetsh interfaceの方を実行する時、192.168.0.1設定前にアドレス設定自体を一旦無効化し、それから設定するので、

    無効化の瞬間route addによる設定が解除されたのだろうと解釈しました。

    それを確認すべく予め宛先が0.0.0.0、マスクも0.0.0.0のルートをルーティングテーブル上にデフォルトゲートウェイとして追加しておき、

    コマンドラインからnetsh interface ~を実行してみると案の定デフォルトゲートウェイが消えました。

    この辺記憶によればXP(但しipv4ではなくipの指定)と挙動が違うように見えますが、仕様変更かもしれないと思い、作業を進めることにしました。

    今度は順番を入れ替えてバッチを作り直し

    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0

    route add 0.0.0.0 mask 0.0.0.0 192.168.0.254

    を実行してみました。しかし意に反してやはりroute addが動作していないように見えます。

    そこでこれらを別々のバッチファイルに格納し、順番に個別に実行してみました。

    するとroute addはちゃんと動作しました。

    色々な場合で試した訳ではないのですが、このような場合の動作仕様の見当がつきません。どこかにこの辺の説明が無いでしょうか?

    英語でも結構です。

     



    2011年9月27日 10:37

回答

  • 確かに同様の現象は確認できました。

    まず、netshコマンドの挙動についてですが、コマンドのヘルプを見るとXPと7では異なっているようです。
    [XP]
    gateway      - 次のいずれかの値を指定します:
                       <IP address>: 設定している静的 IP アドレスに対する特定の
                                      デフォルト ゲートウェイ
                        none: デフォルト ゲートウェイが設定されていません。
    [7]
    gateway      - 次のいずれかの値を指定します:
                         <IPv4 アドレス>: 設定している静的 IP アドレスに対する特定
                                          のデフォルト ゲートウェイです。
                         none: デフォルト ゲートウェイは設定されません。
                               これは既定値です。

    XPではgatewayが指定されていない場合には以前の値が残るようですが、7ではnoneが既定値のためゲートウェイが消えてしまうようです。



    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0
    route add 0.0.0.0 mask 0.0.0.0 192.168.0.254
    を1つのbatで実行したときに2行目が実行されない件は、1行目の処理が完結しないうちに2行目のコマンドが実行されてしまっているような感じで、1行目と2行目の間にpauseを入れ一旦処理を止めれば正常に動作するようです。

    1行目と2行目の間で時間稼ぎ処理を行う方法もありますが、以下のように1行で書くと問題がありますか?
    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0 gateway=192.168.0.254


    • 回答としてマーク お札の門 2011年9月28日 6:37
    2011年9月27日 14:10

すべての返信

  • 確かに同様の現象は確認できました。

    まず、netshコマンドの挙動についてですが、コマンドのヘルプを見るとXPと7では異なっているようです。
    [XP]
    gateway      - 次のいずれかの値を指定します:
                       <IP address>: 設定している静的 IP アドレスに対する特定の
                                      デフォルト ゲートウェイ
                        none: デフォルト ゲートウェイが設定されていません。
    [7]
    gateway      - 次のいずれかの値を指定します:
                         <IPv4 アドレス>: 設定している静的 IP アドレスに対する特定
                                          のデフォルト ゲートウェイです。
                         none: デフォルト ゲートウェイは設定されません。
                               これは既定値です。

    XPではgatewayが指定されていない場合には以前の値が残るようですが、7ではnoneが既定値のためゲートウェイが消えてしまうようです。



    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0
    route add 0.0.0.0 mask 0.0.0.0 192.168.0.254
    を1つのbatで実行したときに2行目が実行されない件は、1行目の処理が完結しないうちに2行目のコマンドが実行されてしまっているような感じで、1行目と2行目の間にpauseを入れ一旦処理を止めれば正常に動作するようです。

    1行目と2行目の間で時間稼ぎ処理を行う方法もありますが、以下のように1行で書くと問題がありますか?
    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0 gateway=192.168.0.254


    • 回答としてマーク お札の門 2011年9月28日 6:37
    2011年9月27日 14:10
  • OMEGATさん、ご回答ありがとうございました。

    >1つのbatで実行したときに2行目が実行されない件は、1行目の処理が完結しないうちに2行目のコマンドが実行されてしまっているような感じで

    なるほどそういうことはあり得ますね。
    コマンドラインを並べたバッチということで順番に実行されるものだという先入観にとらわれていました。
    確かにnetshは後から取ってつけたような実装だということを忘れていました。
    おっしゃる通りpauseを入れたら動作しました。そうだと分かれば対策も考えられます。

    実験用の簡易コードを挿入し、

    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0
    :waitsetip
    ipconfig | find "192.168.0.1"
    if errorlevel 1 goto waitsetip
    route add 0.0.0.0 mask 0.0.0.0 192.168.0.254

    として、IPアドレスの設定が完了するのを待ち合わせてからroute~を実行するようにしたら成功しました。
    本処置はこれから考えますが的確なご指摘ありがとうございました。

    尚頂いた、

    netsh interface ipv4 set address 接続 static 192.168.0.1 mask=255.255.255.0 gateway=192.168.0.254

    ですが、インタフェースにデフォルトゲートウェイを設定するのではなく、
    ここは空欄にしておいて、ルーティングテーブルでコントロールしたい事情がありました。
    こちらもアドバイスありがとうございました。

    2011年9月28日 6:37