IP をコマンドで変更する手順をコパイロットさんに聞いてみました。
さらにバッチ処理するには?も聞いて検証。
最終的にちゃんと使えてるところがコパイロットさんの凄いところだと常々思います。(怖い子だよ!)
IPアドレスをコマンドラインとか、バッチ処理で設定する。
IP アドレスをコマンドプロンプトで変更する。
コマンドラインからIPアドレスを変更するには、以下の手順を参考にしてください。ここでは、Windowsのコマンドプロンプトを使用した方法を紹介します。

1. コマンドプロンプトを管理者権限で起動する
- スタートメニューを開き、「cmd」と入力して検索します。
- 「コマンドプロンプト」を右クリックし、「管理者として実行」を選択します。
2. IPアドレスを設定する
- コマンドプロンプトで以下のコマンドを入力します。
netsh interface ip set address "インターフェース名" static IPアドレス サブネットマスク GW メトリック
例:netsh interface ip set address "イーサネット" static 10.0.0.9 255.0.0.0 10.0.0.1 2ゲートウェイの後ろについているのは、メトリックらしい。


3. DNSサーバーを設定する
DNS もコマンドプロンプトで変更できる。
- コマンドプロンプトで以下のコマンドを入力します。
netsh interface ip set dns "インターフェース名" static DNSサーバーIPアドレス primary
例: netsh interface ip set dns "イーサネット" static 8.8.8.8 primaryコマンドのヘルプから、代替の方の設定がいまいちわからなかったので、どうするのか聞いたところ、
違うコマンドと使うっぽい。
batch:
netsh interface ipv4 add dns name="インターフェース名" addr="代替DNSサーバーIPアドレス" index=2 validate=no
powershell:
Set-DnsClientServerAddress -InterfaceAlias "インターフェース名" -ServerAddresses "優先DNSサーバーIPアドレス","代替DNSサーバーIPアドレス"こんな感じで、インデックスを指定してプライマリと代替の両方を順番に実行すると、いい感じで入れることができました。
例えば「自動取得」に対してindex=2 だけ実行すると、プライマリの方に入力されてしまったので、代替DNS サーバーを狙って値を入力するコマンドではないみたいです。
なので、プライマリDNS サーバーと代替 DNS サーバーの両方を入力したい場合は、下記のコマンドで対応する感じです。
C:\Windows\system32>netsh interface ipv4 add dns /?
使用法: add dnsservers [name=]<文字列> [address=]<IPv4 アドレス>
[[index=]<整数>] [[validate=]yes|no]
例:
netsh interface ipv4 add dns name="イーサネット" addr="8.8.8.8" index=1 validate=no
netsh interface ipv4 add dns name="イーサネット" addr="9.9.9.9" index=2 validate=no
全部を指定したい場合は、下記のような感じになりました。
netsh interface ip set address "イーサネット" static 10.0.0.9 255.0.0.0 10.0.0.1 2
netsh interface ipv4 add dns name="イーサネット" addr="8.8.8.8" index=1 validate=no
netsh interface ipv4 add dns name="イーサネット" addr="9.9.9.9" index=2 validate=no
4. DHCPに戻す(必要に応じて)
IP アドレスなどをDHCP に戻す。
以下のコマンドを入力します。
netsh interface ip set address "インターフェース名" dhcpDNSサーバーをDHCPに戻す。(set の対象が異なる。)
以下のコマンドを入力します。
netsh interface ip set dns "インターフェース名" dhcp管理者権限取得も込みで、、、バッチ処理する。
上記でやりたいことはできるのは確認できました。
コマンド2つあるし、今後のことも考えて、バッチ処理する感じにしたい。
管理者としてバッチを実行するのはいいけど、やや面倒なのでダブルクリックで完結したい。
(どっちにしてもユーザーコントロールなんちゃらを聞かれるので、うっかりミス避けみたいな感も否めませんが、右クリックメニューから実行するより、ダブルクリックの方が楽。)
というフェーズです。
バッチファイル内で管理者権限を取得するためには、以下のスクリプトを使用して、バッチファイル自体を管理者権限で再起動する方法があります。

1. 管理者権限で実行するスクリプト
結局ユーザーなんちゃら(変更を許可しますか?のあれ)の画面が出るので、
パスワードの入力とか場合によって必要。
batch
@echo off
:: 管理者権限が必要なコマンド
echo 管理者権限が必要なコマンドを実行中...
:: 管理者権限で再実行するスクリプト
:checkPrivileges
net session >nul 2>&1
if %errorLevel% == 0 (
goto gotPrivileges
) else (
goto getPrivileges
)
:getPrivileges
if "%1"=="%~0" (echo 管理者権限で実行できませんでした。 & pause & exit /B)
echo 管理者権限で再実行しています...
powershell -Command "Start-Process '%~0' -ArgumentList '%~1' -Verb runAs"
exit /B
:gotPrivileges
shift
:: ここに管理者権限が必要なコマンドを追加します
echo 管理者権限で実行中...
pause
とりあえず上記のスクリプトに、バッチファイルの内容をつなげてもらえばOK です。
2. バッチファイルの説明
このスクリプトは、バッチファイルが管理者権限で実行されているかどうかをチェックし、管理者権限がない場合は、Powershellコマンドを使用して管理者権限で再起動します。
- :checkPrivileges: 管理者権限があるかどうかを確認します。
- :getPrivileges: 管理者権限がない場合、Powershellを使ってバッチファイルを管理者権限で再起動します。
- :gotPrivileges: 管理者権限がある場合、ここに管理者権限が必要なコマンドを追加します。
このスクリプトを使用することで、バッチファイル内で管理者権限を取得し、必要なコマンドを実行することができます。
管理者権限がない場合、再起動してループする仕組み。
powershell の件がうまくいかない場合、フルパスにするといいみたいです。
(ほかにも引数がちゃんと渡せてないんじゃないかとかいう場合もあるかもだそうです。-ArgumentListを消すと動くなら、引数関係の問題かなって思います。)
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Start-Process '%~0' -ArgumentList '%~f0 %*' -Verb runAs"
exit /BそれぞれのPC ごとに作るのも面倒なので、
pc 名で条件分岐してIPアドレスを割り当てるようなテーブルもつけたい。
IPアドレスを変数にして、つかいたい
こんな感じな。

:: PC名に基づいた条件分岐と変数設定
set PC_NAME=%COMPUTERNAME%
echo PC名: %PC_NAME%
if /I "%PC_NAME%"=="PC1" (
:: IPアドレス変数を設定
set IP_ADDRESS=192.168.1.101
) else if /I "%PC_NAME%"=="PC2" (
set IP_ADDRESS=192.168.1.102
) else if /I "%PC_NAME%"=="PC3" (
set IP_ADDRESS=192.168.1.103
) else (
echo 未知のPC名です。デフォルトの設定を適用します。
set IP_ADDRESS=192.168.1.100
)
:: 設定された変数を使用してIPアドレスを設定
netsh interface ip set address "Ethernet" static %IP_ADDRESS% 255.255.255.0 192.168.1.1
netsh interface ip set dns "Ethernet" static 8.8.8.8 primary
echo IPアドレスの設定が完了しました。IPアドレス: %IP_ADDRESS%素晴らしいです。イメージどおりっす。
最後のデフォルト適用の件は想像を超えてきてます。
(実際には、処理をスキップするように設定しました。)
参考
最終的にできたバッチファイル
文字化けしてエラー起こすので、ANSI 形式で保存してます。
windows 11 でもOK。
@echo off
:: 管理者権限が必要なコマンド
echo 管理者権限が必要なコマンドを実行中...
:: 管理者権限で再実行するスクリプト
:checkPrivileges
net session >nul 2>&1
if %errorLevel% == 0 (
goto gotPrivileges
) else (
goto getPrivileges
)
:getPrivileges
if "%1"=="%~0" (echo 管理者権限で実行できませんでした。 & pause & exit /B)
echo 管理者権限で再実行しています...
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -Command "Start-Process '%~0' -ArgumentList '%~f0 %*' -Verb runAs"
exit /B
pause
:gotPrivileges
shift
:: PC名に基づいた条件分岐と変数設定
set PC_NAME=%COMPUTERNAME%
echo PC名: %PC_NAME%
if /I "%PC_NAME%"=="pc1" (
:: IPアドレス変数を設定
set IP_ADDRESS=192.168.1.101
) else if /I "%PC_NAME%"=="pc2" (
set IP_ADDRESS=192.168.1.102
) else if /I "%PC_NAME%"=="pc3" (
set IP_ADDRESS=192.168.1.103
) else (
echo 未知のPC名です。デフォルトの設定を適用します。
goto noprocess
)
echo IP-Addres: %IP_ADDRESS%
pause
echo 管理者権限で実行中...
netsh interface ip set address "イーサネット" static %IP_ADDRESS% 255.255.255.0 192.168.1.1
netsh interface ip set dns "イーサネット" static 8.8.8.8 primary
:noprocess
echo 設定後のIPアドレスを確認してください...
ipconfig /all
pauseネットワークアダプタ設定画面の呼び出し
非アクティブなアダプタのIPだと、ipconfig では確認できないから、
IPV4 のプロパティも一緒に開きたかった。
残念ながらインターネットプロトコル設定画面までの呼び出しコマンドはなさそうです。
あったとしてもアダプタ名の指定は要るだろうから、まあ、この辺りでよろしいかと。
cmd:
control ncpa.cpl
ps:
Start-Process "ncpa.cpl"IP アドレス変更コマンドのソースサイト
https://tsuredurediary.com/archives/ip-address-change.html