バッチファイルでローカルIPアドレスを変数に格納


Y子です。
今回は、ローカルIPアドレスを変数に格納してみます。
グローバルIPアドレスを変数に格納するのは以前やりましたが、ローカルIPアドレスの方が文字列加工が難しく、今回初めてやってみました。

概要・用途

自分のローカルIPアドレスを取得して、変数に格納します。
ログを取得したり、なんらかの自動化処理の中で、使うことを想定します。
確認環境:Windows 10 Home (Bld. 19042.928)

コード

(1) FIND関数の準備

まず、ExcelのFIND関数に相当する「指定の文字が何文字目か調べる処理」を使いたいので、これを独立したバッチファイルにしておき、戻り値を利用できるようにします。
エラー処理は、機会があれば検討してみたいですが、今回は真面目に考えていません。

FIND関数を考えたときから出力が少し変わっただけですが、コードを載せておきます。
(行数多くて恥ずかしいんですよね。もうちょっとコンパクトにできたらいいんですが)

find_like_excel.bat
@echo off
rem 検索文字列, 対象, [開始位置=1]
set find_text=%~1
set within_text=%~2
set start_num=%~3

rem 位置カウンタ初期化
set charpos=0
rem 文字位置カウント(サブルーチン実行)
call :find_like_excel "%find_text%" "%within_text%" "%start_num%"

rem 結果出力
echo %charpos%
exit /b

rem ====サブルーチン====
rem 文字位置をカウントする
:find_like_excel
  setlocal

  rem 引数がない場合は終了する
  if "%~2"=="" (echo 引数がありません & pause & exit /b)

  rem 検索文字列, 対象, [開始位置=1]
  set find_text=%~1
  set within_text=%~2
  set start_num=%~3

  rem 開始位置の指定がない場合はデフォルト「1」
  if "%start_num%"=="" (set start_num=1)
  rem バッチファイルのデフォルトは「0」なので合わせる
  set /a start_num-=1

  rem 開始位置の調整
  call set within_text=%%within_text:~%start_num%%%

  rem 文字位置カウントのループ開始
  :label_find
  rem 位置カウンタ加算
  set /a charpos+=1

  rem 文字列がなくなったら終了
  if "%within_text%"=="" (
    set charpos=0
    goto :label_end
  )

  set length=0
  set str_tmp=%find_text%

  rem strlenループ開始
  :label_strlen
  rem 長さ加算
  set /a length+=1
  rem 1文字減らす
  set str_tmp=%str_tmp:~1%
  rem 文字列がなくなったら終了
  if not "%str_tmp%"=="" (goto :label_strlen)
  rem strlenループ終了

  rem 文字列が一致すれば終了
  call set str_tmp=%%within_text:~0,%length%%%
  if "%str_tmp%"=="%find_text%" (goto :label_end)

  rem 文字列がまだあれば、1文字減らしてループ
  set within_text=%within_text:~1%
  goto :label_find
  rem 文字位置カウントのループ終了

  :label_end
  endlocal && set charpos=%charpos%
exit /b

(2) ipconfigコマンドの結果を加工

Windowsでネットワーク情報を知るといえば、ipconfigコマンドです。
これに「IPアドレスだけを出力」のようなオプションがあればいいのですが、見当たらないので、力技で実現します。

get_localip.bat
@echo off

rem ipconfigの結果から「IPv4」の行を抽出
rem (IPv4 アドレス . . . . . . . . . . . .: 192.168.x.x)
for /f "usebackq delims=" %%a in (`ipconfig^|findstr "IPv4"`) do set ipaddr=%%a

rem スペースは邪魔になるので削除
rem (IPv4アドレス............:192.168.x.x)
set ipaddr=%ipaddr: =%

rem ":"の位置を取得
for /f "usebackq" %%a in (`call find_like_excel.bat ":" %ipaddr%`) do set pos=%%a

rem ":"までを削除
call set ipaddr=%%ipaddr:~%pos%%%

echo %ipaddr%
実行結果
> get_localip.bat
192.168.x.x

おわりに

グローバルIPアドレスも取れたんだからローカルIPアドレスもね、という感じで作ってみました。
何に使えるかは正直わかりません。笑
役に立った方は用途を教えてくださると嬉しいです。

では!