IPアドレスを変更するBatファイルが上手く動かない!!
ということで、今回はIPアドレスをBatファイルで変更する方法についていろいろ試行錯誤したので記事にしてみたいと思います。
やったことはよくある固定IPアドレスの変更なのですが、先人者様たちがブログ等に載せているやり方でBatファイルを作成し、全てのPCで利用しようとすると一部のPCでうまく動かないことがありました。
原因は、ネットワークカードの接続名がBatファイルの名称と異なっているからうまく処理できないというものでした。
図のように
本来新規でセットアップした際は、”ローカル エリア接続”という語尾に数字がついていないネットワークカードの接続名なのですがなぜか “5”という数字が出現!!
なんでかなぁといろいろ調べていると怪しいのが見つかりました。
私は新しいPCを準備する際に初期セットアップを簡略化するため、Acronisというソフトでマスターコピーデータを作成し展開しているのですが、新規PCにマスタデータを復元した際にネットワークカードの接続名がレジストリに残るのか、毎回数字がつくようになっておりました。
接続名が変わってもIPアドレスを変更するBatファイル
毎回Batファイルの接続名を変更しないといけないとなるとBatファイルの意味がないので、なんとか回避したいと思いいろいろ試行錯誤してみて下記のようなBatファイルを作成しました。同じ悩みを抱えている人がいれば、コピペして試してみてください。(解説は↓)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@echo off rem ▼仮IPを入力しています。実際に使用するIPアドレスを入力してね!-------------- set Ip_Address=192.168.10.1 set Subnet_Mask=255.255.255.0 set Default_Gateway=192.168.10.254 set Dns1=192.168.10.100 set Dns2=192.168.10.101 rem ▲---------------------------------------------------------------- setlocal enabledelayedexpansion for /f "tokens=1,2,*" %%A in ('ipconfig /all ^| find "イーサネット アダプター"') do ( set Network_Name=%%C ) set Local_Network=!Network_Name:~0,-1! netsh interface ip set address name="!Local_Network!" static %Ip_Address% %Subnet_Mask% %Default_Gateway% netsh interface ip set dns name="!Local_Network!" static %DNS1% register=PRIMARY netsh interface ip add dns name="!Local_Network!" %DNS2% index=2 endlocal exit |
Batファイルの解説!!
ここからはBatファイルの解説を行いたいとおもいますので興味のない方はそっと閉じてください(笑)
まず、1行目から8行目までは簡単なので適当に書きます。。
- 「@echo off」は処理内容を非表示に。
- 「rem」から始まるものは処理に影響しないコメント。
- 「set」で変数名を定義し、値を格納しています。ここのIPアドレスを自分の環境に合わせて変更してください。
で、ここから悩んだところなのですが
従来のやり方だと1行目から8行目の間にもう一つ変数を加え、ネットワーク接続名を「ローカル エリア接続」といった形で入れていたのですが、それだと上記の問題で動かないケースがあったので無理やり取得する方法にしました。
その方法が10行目からになるのですが
コマンドプロンプトで「ipconfig /all」と打ち込むと取得できる情報のうち、ネットワーク名の部分を抜き出しそれを変数にぶち込むという風にしました。
オレンジ色の部分です。
- 「setlocal enabledelayedexpansion」で遅延環境変数を使用できるようにし
- 「‘ipconfig /all ^| find “イーサネット アダプター”‘」でイーサネット アダプターという文字列が含まれる行を検索しています。
- この中で、ローカル エリア接続 5:という部分をまずは抜き出したいのでfor文を使用しています。ここまでで
- %%A⇒イーサネット
- %%B⇒アダプター
- %%C⇒ローカル エリア接続 5:
- が格納されます。「“tokens=1,2,*”」としているのは、*にしないとスペースの部分で分断されてしまうからです。こうして取得できた%%Cの値を「Network_Name」に入れております。
- しかし、実際に使用したい文字列は「ローカル エリア接続 5:」でなく「ローカル エリア接続 5」で”:”は不要なため、「!Network_Name:~0,–1!」で取り除いた値をさらに「Local_Network」に格納しています。
- これで、Local_Network=ローカル エリア接続5になりましたので3行目~7行目の値を元に15行目~17行目を実行しています。
補足
今回Windows7の有線ネットワークで試しましたが、Windows10だと”ローカル エリア接続”の部分が”イーサネット”になるかと思うのですが、そちらもBatファイルの内容を変えなくても問題なく動くと思います。
ちなみに管理者の権限がないアカウントで行うとそもそも動かないので、管理者権限のあるアカウントで動かすか、Runasコマンドでの権限昇格を行い、Batファイルを呼び出すようにしてみてください。
コメント
参考にさせて頂きました。
私は、PC名からIPを選択して入れる仕様にしました。
・コピペではダメでスペースを添付しないと動かない
・%% と!!の違いについての解説を深堀した方が
・イーサネット アダプター イーサネット: と変更(Hyper-Vの仮想スイッチへ行く対策)
@echooff
setlocal enabledelayedexpansion
rem ▼変更するIPアドレスを入力しています—————————-
set PCNAME1_newIpAdd=192.168.61.1
set PCNAME2_newIpAdd=192.168.61.2
set PCNAME3_newIpAdd=192.168.61.3
rem ▲—————————————————————-
rem @echooff
rem ▼仮IPを入力しています——————————————–
set Ip_Address=!%COMPUTERNAME%_newIpAdd!
set Subnet_Mask=255.255.255.0
set Default_Gateway=192.168.61.254
set Dns1=8.8.8.8
set Dns2=
rem ▲—————————————————————-
for /f “tokens=1,2,*” %%A in (‘ipconfig /all ^| find “イーサネット アダプター イーサネット:”‘) do set Network_Name=%%C
set Local_Network=!Network_Name:~0,-1!
netsh interface ipv4 set address name=”!Local_Network!” static address=%Ip_Address% mask=%Subnet_Mask% gateway=%Default_Gateway%
netsh interface ipv4 set dns name=”!Local_Network!” static %DNS1% register=PRIMARY validate=no
rem netsh interface ipv4 add dns name=”!Local_Network!” %DNS2% index=2 validate=no
endlocal
exit
初めまして。
未経験で社内SEになったばかりの者です。
ネットワークアダプタ名を自動取得してアドレス変更をbatファイルでできないか
探しているなか答えとなる情報を掲示してくださりありがとうございます。
もう一点、ご教授いただけたらと思うのですが
ネットワークアダプタが複数あり、複数変更したい場合は
どのように書けばよろしいのでしょうか
コメントありがとうございます。
ネットワークアダプタが複数ある場合についてですが、下記のやり方はいかがでしょうか?
綺麗ではありませんが、今の記述をあまり変えずに考えてみました。
(検証はしてないです。動かなかったら申し訳ありません。)
まず、記事で記載していなかった部分を補足させていただきます。
—
for /f “tokens=1,2,*” %%A in (‘ipconfig /all ^| find “イーサネット アダプター”‘) do (
set Network_Name=%%C
)
—
こちらのfor文の処理についてですが、”イーサネット アダプター”という文字をipconfig /allの結果から検索しています。
探す中で”イーサネット アダプター”という文字が複数出てきた場合、一番最後に出てきた行を Network_Name に格納します。
つまり、ネットワークアダプタが複数ある場合は、最後に出てきたネットワークアダプタ名を格納します。
これを最初に”イーサネット アダプター”という文字がでてきた時点で検索をやめてしまい
その時点のネットワークアダプタ名を格納するようにすれば、ネットワークアダプタが2つあっても対応可能かと思います。
記述的には
—
for /f “tokens=1,2,*” %%A in (‘ipconfig /all ^| find “イーサネット アダプター”‘) do (
set Network_Name=%%C
)&if %%C==!Network_Name! goto :exitfor
:exitfor
—
このように変更すれば、ipconfig /allで最初に出てきた”イーサネット アダプター”のアダプタ名を使用することができるかと思います。
さらに、3つある場合ですが
—
for /f “skip=1 tokens=1,2,*” %%A in (‘ipconfig /all ^| find “イーサネット アダプター”‘) do (
set Network_Name=%%C
)&if %%C==!Network_Name! goto :exitfor
:exitfor
—
とすれば、1つ目の検索で出てきたネットワークアダプタ名をスキップします。
そのため、2つ目の検索で出てきたネットワークアダプタ名を格納します。
TrueImageでクローニングされているとお見受けしましたが、SIDの初期化はちゃんとされていますか?
お返事が大変大変遅くなり申し訳ないです。
はい。Sysprepをかけた後に、次回起動をする前にAcronis True Imageを起動してイメージマスタを作成しております。