端末のIPアドレスを 有効なものを自動判定して設定するバッチ

##概要
ノートPCを検証などの理由で他のネットワークに繋いだ後、
IPアドレスの設定をまた戻すのが面倒だな
とよく感じます。

本バッチファイルは、IPアドレスをリストから順番に設定していき、デフォルトゲートウェイと疎通が取れるまで、即ち有効なIPアドレスに当たるまで繰り返させます。

これにより、毎回IPアドレスを調べてコントロールパネルのネットワークアダプタ一覧から...なんてやらなくても、一発起動して暫く放置するだけで済みます。

##環境
Windows 10, Windows 7

##使用方法
* 設定対象のネットワークアダプタ名及び設定候補のIPアドレスを記述したリストファイル（CSVファイル）を、"setIP.bat" ファイルにDrag&Dropします。
* ファイルへのドロップが難しい場合は、そのまま起動するとファイルパスの入力を求められるため、リストファイルをプロンプト画面にD&Dして [Enter]キーを押下します。
* PowerShellのコマンドが使用できない場合は、"setIPs.bat" を右クリックして、「管理者として実行」を選択します。
* ユーザーアカウント制御 (UAC) ダイアログが表示された場合は、「はい」を選択します。 

* CSVファイルの例を同梱しましたので、参考にしてください。 
 * 2カラム目にDHCPと記述すると、DHCPサーバから自動取得する設定をします。
 * 1カラム目に "#" を含めると、その行の処理をスキップします。
* 本バッチは、処理が成功したかを確認できるよう、また元の設定が判らなくならないよう、下記の通りログファイルを生成します。不要であれば削除しても差し支えありません。
 * ネットワークアダプタの現在のIPアドレス設定が "setIPs-bak.log" に出力されます。
 * リストファイル（CSVファイル）を1行処理する度に、ログファイル"setIPs.log" に処理結果及びパラメータが出力されます。
 * 直近のIPアドレス設定が "setIPs-bak.txt" に出力され、リストファイルが最後まで到達しても有効なIPアドレスを発見できなかった場合は、このバックアップファイルで設定をリストアしてバッチファイルを終了します。
* IPアドレスの設定は、管理者権限が与えられていないユーザーアカウントではできません。そのため、"setIPs.bat" が管理者として実行されるよう、"setIP.bat" から呼び出しています。

※他の機器とIPアドレスの重複を起こさないよう注意しながら、リストを作成して下さい。

##ソースファイル
「マジック生成」するには、本ページ全体を選択してコピー後に[**B642FHT.bat**](https://qiita.com/X-IA/items/1db1929775e34ac7ef01)を起動して下さい。
その後、生成したZIPファイルを解凍して任意の場所へ配置して下さい。

興味ある方は、以下のコードをご覧ください。

###コード

```:setIPsS.bat
@ECHO OFF
COLOR 0A

REM ############# setIPsS.bat ##############
REM # Attempting to set IP address         #
REM #                         core process #
REM #                                      #
REM #   1st release: 2019-05-12            #
REM #   Last update: 2019-06-22            #
REM #   Author: Y. Kosaka                  #
REM #   See the web for more information   #
REM #   https://qiita.com/x-ia             #
REM ########################################

SETLOCAL ENABLEDELAYEDEXPANSION

SET tNIC=%~1
SET tNIC="%tNIC:"=%"
SET ipHost=%~2
SET ipNMask=%~3
SET ipDGW=%~4
SET ipDNS=%~5
SET ipDNS2=%~6
SET nPing=2
SET nWait=4
SET nCnt=0
SET nCntLim=3
SET return=-2

ECHO "%ipHost%" | FIND /I "d" >NUL
IF NOT ERRORLEVEL 1 GOTO setdhcp

:setstatic
netsh interface ip set address %tNIC% static %ipHost% %ipNMask% %ipDGW%

CALL :test

IF %return%. EQU 0. (
  IF %ipDNS%. NEQ . netsh interface ip set dns %tNIC% static %ipDNS% primary
  IF %ipDNS2%. NEQ . netsh interface ip add dns %tNIC% %ipDNS2%
)

GOTO eof


:setdhcp
netsh interface ip set address %tNIC% dhcp
netsh interface ip set dns %tNIC% dhcp

PING -n %nWait% 127.0.0.1>NUL
CALL :test

GOTO eof


:getaddr
PING -n %nPing% 127.0.0.1>NUL
FOR /f "usebackq delims=" %%i IN (`netsh interface ip show config %tNIC% ^| FINDSTR アドレス`) DO SET ipHost2=%%i
SET ipHost2=%ipHost2:~-15%
FOR /f "usebackq delims=" %%i IN (`netsh interface ip show config %tNIC% ^| FINDSTR デフォルト`) DO SET ipDGW=%%i
SET ipDGW=%ipDGW:~-15%
EXIT /B


:eof
EXIT /B %return%


:test
SET ipHost2=%ipHost%

ECHO "%ipHost%" | FIND /I "d" >NUL
IF NOT ERRORLEVEL 1 CALL :getaddr

:loop
PING -n %nPing% -S %ipHost2% %ipDGW% | FINDSTR TTL
SET return=%ERRORLEVEL%
IF %return%. EQU 0. (
  EXIT /B
) ELSE (
  SET /A nCnt=nCnt+1
  IF %nCnt% NEQ %nCntLim% GOTO loop
)
EXIT /B
```

```:setIPs.bat
@ECHO OFF
COLOR 0B
SETLOCAL ENABLEDELAYEDEXPANSION

ECHO ############## setIPs.bat ##############
ECHO # Attempting to set IP address         #
ECHO #                      iteration batch #
ECHO #                                      #
ECHO #   1st release: 2019-05-12            #
ECHO #   Last update: 2019-07-13            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=%~n0
SET fList="%1"
SET nLine=0
SET tBak=bak
SET extLog=.log
SET extBak=.txt

IF %fList% EQU "" (
  ECHO Current directory = %~dp0
  ECHO.
  ECHO NIC,HostIP/DHCP,Netmask,DefaultGW,DNS1,DNS2
  ECHO Enter the file includes IP address parameters like above.
  SET /P fList=filepath= 
) ELSE (
  ECHO Input file:
  ECHO %fList%
)
ECHO.

ECHO "%fList%" | FIND /I "\" >NUL
IF ERRORLEVEL 1 SET fList=%~dp0%fList%
SET fList="%fList:"=%"

:backup
ECHO %date% %time%	^>netsh interface ip dump>>%~dpn0-%tBak%%extLog%
netsh interface ip dump>>%~dpn0-%tBak%%extLog%
netsh interface ip dump>>%~dpn0-%tBak%%extBak%

:count
FOR /F "usebackq skip=1 tokens=1-2 delims=," %%a IN (%fList%) DO (
  SET /A nLine=nLine+1
)
SET nLineMax=%nLine%
SET nLine=0

:iterate
FOR /F "usebackq skip=1 tokens=1-7 delims=," %%a IN (%fList%) DO (
  SET /A nLine=nLine+1
  TITLE %tScr% !nLine!/%nLineMax%
  ECHO %%a %%b %%c %%d %%e %%f %%g

  SET flag=.
  ECHO "%%a" | FIND /I "#" >NUL
  IF NOT ERRORLEVEL 1 SET flag=#

  IF !flag! EQU # (
    ECHO %date% %time%	%tScr%	Skipped	%%a	%%b	%%c	%%d	%%e	%%f	%%g>>%~dpn0%extLog%
    ECHO %date% %time%	Skipped
  ) ELSE (
    ECHO Now attempting...
    CALL %~dp0%tScr%S.bat "%%b" %%c %%d %%e %%f %%g
    SET return=!ERRORLEVEL!
    ECHO %date% %time%	%tScr%	!return!	%%a	%%b	%%c	%%d	%%e	%%f	%%g>>%~dpn0%extLog%
    ECHO %date% %time%	Error code: !return!
    IF !return! EQU 0 (
      ECHO Succeeded.
      TITLE %tScr% !nLine!/%nLineMax% Success
      GOTO showconf
    )
    ECHO.
  )

)
ECHO Failed.
TITLE %tScr% !nLine!/%nLineMax% Failure

netsh -f %~dpn0-%tBak%%extBak%
DEL %~dpn0-%tBak%%extBak%

:showconf
netsh interface ip show config

:eof
TIMEOUT /T -1
ENDLOCAL
```

```:setIP.bat
@ECHO OFF
COLOR 0E
SETLOCAL ENABLEDELAYEDEXPANSION

ECHO ############## setIP.bat ###############
ECHO # Attempting to set IP address starter #
ECHO #                                      #
ECHO #   Remodeling : 2019-05-18            #
ECHO #   Last update: 2019-07-13            #
ECHO #   Author: Y. Kosaka                  #
ECHO #   See the web for more information   #
ECHO #   https://qiita.com/x-ia             #
ECHO ########################################

SET tScr=setIP
SET fList="%1"

IF %fList% EQU "" (
  ECHO Current directory = %~dp0
  ECHO.
  ECHO NIC,HostIP/DHCP,Netmask,DefaultGW,DNS1,DNS2
  ECHO Enter the file includes IP address parameters like above.
  SET /P fList=filepath= 
) ELSE (
  ECHO Input file:
  ECHO %fList%
)
ECHO.

ECHO "%fList%" | FIND /I "\" >NUL
IF ERRORLEVEL 1 SET fList=%~dp0%fList%
SET fList="%fList:"=%"

ECHO Please click "Yes" button on User Account Control dialog.
powershell start-process %~dp0\%tScr%s.bat %fList% -verb runas

EXIT /B
```

###バイナリ (Base64 encoding)

```
setIP.zip
---
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
AOMAAADyCQAAAAA=
---
```