【bat】バッチファイルでIPアドレスを取得してログに記録する完全ガイド|ipconfig・wmic・NIC絞り込み・変更検知・定期記録まで

【bat】バッチファイルでIPアドレスを取得してログに記録する完全ガイド|ipconfig・wmic・NIC絞り込み・変更検知・定期記録まで bat

バッチファイルでIPアドレスを取得・記録しておくと、DHCP環境でのIPアドレス変動の追跡・障害時の接続情報確認・複数PCの構成管理に役立ちます。

単純な ipconfig | findstr だけでは複数NICがある環境で誤ったIPを取得してしまう場合があります。本記事では ipconfig・wmic・PowerShell の3方式を比較し、NIC(ネットワークアダプター)の絞り込み・MACアドレスやゲートウェイの取得・IPアドレス変更の自動検知まで実践コードで解説します。

この記事でわかること

  • ipconfig + findstr でIPv4アドレスを抽出する基本
  • Wi-FiとイーサネットなどNICを絞り込んでIPを取得する方法
  • wmic でIP・MACアドレス・サブネット・ゲートウェイを一括取得する方法
  • PowerShell でシンプルかつ確実にIPを取得する方法
  • IPアドレスの変更を検知して差分をログに記録する方法
  • タスクスケジューラで定期的にIPをログ記録する設定
スポンサーリンク

IP取得方法の比較

方法 コマンド 精度 NIC絞り込み 追加情報
ipconfig + findstr ipconfig | findstr “IPv4” △(全NICが対象) △(要加工) なし(IPv4のみ)
wmic nicconfig wmic nicconfig where IPEnabled=True ○(NIC名で絞込可) MAC・ゲートウェイ・サブネット
PowerShell Get-NetIPAddress ◎(InterfaceAlias で絞込) インターフェース名・プレフィックス長
複数NICがある環境では絞り込みが重要
Wi-Fi・イーサネット・VPN・仮想NIC(VMware/Hyper-V)が混在する環境では ipconfig | findstr "IPv4" を使うと複数の行が返ります。意図したNICのIPを確実に取得するには アダプター名での絞り込みが必要です。

基本:ipconfig でIPv4アドレスを取得してログに記録する

最もシンプルな実装です。for /fipconfig の出力からIPv4アドレス行を抽出し、コロン以降の値を取り出します。

基本: IPv4アドレスをログに記録
@echo off
setlocal enabledelayedexpansion

set LOGFILE=C:\logs\ip_log.txt
if not exist "C:\logs" mkdir "C:\logs"

REM IPv4 行を取得(複数NICがある場合は最初の1件)
set IP=
for /f "tokens=2 delims=:" %%I in ('ipconfig ^| findstr "IPv4"') do (
    if not defined IP (
        set IP=%%I
        REM 先頭スペースを除去
        set IP=!IP:~1!
    )
)

REM タイムスタンプを整形
set T=%TIME: =0%
set TS=%DATE% %T:~0,8%

echo [%TS%] %COMPUTERNAME% IP=%IP% >> "%LOGFILE%"
echo IP取得完了: %IP%
endlocal
for /f で ipconfig を実行するときの ^ エスケープ
for /f のシングルクォート内でパイプ | を使うには^| のようにキャレットでエスケープする必要があります。エスケープを忘れると | が外側のコマンドのパイプとして解釈されエラーになります。

NICを絞り込んでIPを取得する(Wi-Fi / イーサネット)

複数NICがある環境では、セクション名(アダプター名)でフィルタリングして目的のNICのIPのみを取得します。

イーサネットアダプターのIPのみ取得
@echo off
setlocal enabledelayedexpansion

REM 対象アダプター名(ipconfig の出力に含まれる文字列)
set TARGET_ADAPTER=イーサネット アダプター イーサネット

set IN_SECTION=0
set ETH_IP=

for /f "tokens=* delims=" %%L in ('ipconfig') do (
    REM セクション開始行を検出
    echo %%L | findstr /i "%TARGET_ADAPTER%" >nul 2>&1
    if !errorlevel! equ 0 set IN_SECTION=1

    REM 別セクション開始でリセット(空行またはアダプター行)
    echo %%L | findstr /r "^[A-Za-z].*アダプター" >nul 2>&1
    if !errorlevel! equ 0 (
        echo %%L | findstr /i "%TARGET_ADAPTER%" >nul 2>&1
        if !errorlevel! neq 0 set IN_SECTION=0
    )

    REM 対象セクション内の IPv4 行を抽出
    if !IN_SECTION! equ 1 (
        echo %%L | findstr "IPv4" >nul 2>&1
        if !errorlevel! equ 0 (
            for /f "tokens=2 delims=:" %%I in ("%%L") do (
                set ETH_IP=%%I
                set ETH_IP=!ETH_IP:~1!
            )
        )
    )
)

if defined ETH_IP (
    echo イーサネット IP: %ETH_IP%
) else (
    echo イーサネット接続なし
)
endlocal
アダプター名は ipconfig で確認する
日本語環境では「イーサネット アダプター イーサネット」「Wi-Fi アダプター Wi-Fi」、英語環境では「Ethernet adapter Ethernet」「Wireless LAN adapter Wi-Fi」のように表示されます。まず ipconfig を実行してアダプター名を確認し、TARGET_ADAPTER に設定してください。

wmic でIP・MAC・ゲートウェイを一括取得する

wmic nicconfig を使うと IPアドレスだけでなくMACアドレス・サブネットマスク・デフォルトゲートウェイも取得でき、ネットワーク構成の記録に適しています。

wmic でIP・MAC・ゲートウェイを一括取得してログに記録
@echo off
setlocal

set LOGFILE=C:\logs\netinfo.txt
if not exist "C:\logs" mkdir "C:\logs"

set T=%TIME: =0%
echo ===== %DATE% %T:~0,8% %COMPUTERNAME% ===== >> "%LOGFILE%"

REM wmic で有効なNICの情報を一括取得
wmic nicconfig where "IPEnabled=True" get Description,IPAddress,MACAddress,DefaultIPGateway /format:list >> "%LOGFILE%"

echo. >> "%LOGFILE%"
echo NIC情報をログに記録しました: %LOGFILE%
endlocal
wmic でIPアドレスのみを変数に取り込む
@echo off
setlocal enabledelayedexpansion

REM wmic の IPAddress 出力例: {"192.168.1.100","fe80::1234:..."}
REM IPv4 部分(最初のアドレス)のみを取り出す

set WMIC_IP=
for /f "tokens=2 delims={}" %%A in (
    'wmic nicconfig where "IPEnabled=True" get IPAddress /value ^| findstr "IPAddress="'
) do (
    REM カンマ区切りの最初の要素がIPv4
    for /f "tokens=1 delims=," %%I in ("%%A") do (
        set WMIC_IP=%%I
        REM ダブルクォートを除去
        set WMIC_IP=!WMIC_IP:"=!
    )
    goto :wmic_done
)
:wmic_done
echo wmic IP: %WMIC_IP%
endlocal
wmic IPAddress の形式は {“IPv4″,”IPv6”,…}
wmic の IPAddress フィールドは {"192.168.1.100","fe80::..."} のような配列形式で返ります。delims={} で中身を取り出した後、カンマ区切りの1番目がIPv4アドレスです。ダブルクォートは set VAR=!VAR:"=! で除去できます。

PowerShell でシンプルかつ確実にIPを取得する

PowerShell の Get-NetIPAddress コマンドレットを使うと簡潔なコードで確実にIPv4アドレスを取得できます。ループバック(127.x.x.x)や仮想NICを除外することも容易です。

PowerShell でIPv4アドレスを取得してバッチに渡す
@echo off
setlocal

REM PowerShell でループバック・仮想NICを除いた最初のIPv4を取得
for /f %%I in (
    'powershell -NoProfile -Command "
    (Get-NetIPAddress -AddressFamily IPv4 |
    Where-Object { $_.IPAddress -notlike ''127.*'' -and $_.PrefixOrigin -ne ''WellKnown'' } |
    Select-Object -First 1).IPAddress"'
) do set IP=%%I

echo IPv4アドレス: %IP%
endlocal
PowerShell で全NICのIP一覧を取得してログに記録
@echo off
setlocal

set LOGFILE=C:\logs\ip_all.txt
if not exist "C:\logs" mkdir "C:\logs"

set T=%TIME: =0%
echo ===== %DATE% %T:~0,8% ===== >> "%LOGFILE%"

REM 全有効NICのアダプター名とIPv4を一覧出力
powershell -NoProfile -Command "
Get-NetIPAddress -AddressFamily IPv4 |
Where-Object { $_.IPAddress -notlike '127.*' } |
Select-Object InterfaceAlias,IPAddress |
Format-Table -AutoSize" >> "%LOGFILE%"

echo NIC一覧をログに記録しました
endlocal

IPアドレスの変更を検知してログに記録する

DHCP環境ではIPアドレスが変わることがあります。前回記録したIPと現在のIPを比較し、変更があったときだけログに記録することでIPアドレスの変動履歴を効率的に管理できます。

IP変更検知: 前回と異なる場合のみログに記録
@echo off
setlocal enabledelayedexpansion

set LOGFILE=C:\logs\ip_change.log
set IP_CACHE=C:\logs\ip_last.txt
if not exist "C:\logs" mkdir "C:\logs"

REM 現在のIPを取得
set CURRENT_IP=
for /f "tokens=2 delims=:" %%I in ('ipconfig ^| findstr "IPv4"') do (
    if not defined CURRENT_IP (
        set CURRENT_IP=%%I
        set CURRENT_IP=!CURRENT_IP:~1!
    )
)

REM 前回のIPをキャッシュファイルから読み込む
set PREV_IP=
if exist "%IP_CACHE%" (
    for /f %%I in (%IP_CACHE%) do set PREV_IP=%%I
)

REM 変更検知
if not "%CURRENT_IP%"=="%PREV_IP%" (
    set T=%TIME: =0%
    echo [%DATE% !T:~0,8!] 変更検知: %PREV_IP% -> %CURRENT_IP% >> "%LOGFILE%"
    echo %CURRENT_IP% > "%IP_CACHE%"
    echo [変更] %PREV_IP% -^> %CURRENT_IP%
) else (
    echo [変更なし] 現在のIP: %CURRENT_IP%
)
endlocal
IP変更検知の仕組み
ip_last.txt に前回のIPを保存しておき、現在のIPと比較します。初回実行時はキャッシュファイルがないため PREV_IP が空になり、必ずログに記録されます。これを利用して「初回実行時に現在のIPを記録する」動作としても活用できます。このバッチをタスクスケジューラで定期実行することで、DHCPによるIP変動の履歴を自動記録できます。

実践:定期実行用のネットワーク情報記録バッチ

これまでの手法を組み合わせた、タスクスケジューラで定期実行する実践的なネットワーク情報記録バッチです。IP・MACアドレス・ゲートウェイを日付別ファイルに記録します。

net_record.bat: 定期実行用ネットワーク情報記録
@echo off
setlocal enabledelayedexpansion

REM --- 設定 ---
set LOG_DIR=C:\logs\network
if not exist "%LOG_DIR%" mkdir "%LOG_DIR%"

REM 日付付きログファイル名(ロケール非依存)
for /f "tokens=2 delims==" %%A in ('wmic os get LocalDateTime /value') do set DT=%%A
set TODAY=%DT:~0,8%
set LOGFILE=%LOG_DIR%\net_%TODAY%.log

REM タイムスタンプ
set T=%TIME: =0%
set TS=%DT:~0,4%-%DT:~4,2%-%DT:~6,2% %DT:~8,2%:%DT:~10,2%:%DT:~12,2%

echo ===== %TS% %COMPUTERNAME% ===== >> "%LOGFILE%"

REM IPアドレス(全NIC)
echo [IP] >> "%LOGFILE%"
ipconfig | findstr "IPv4" >> "%LOGFILE%"

REM MACアドレス・ゲートウェイ
echo [NIC詳細] >> "%LOGFILE%"
wmic nicconfig where "IPEnabled=True" get Description,MACAddress,DefaultIPGateway /format:list >> "%LOGFILE%"

echo. >> "%LOGFILE%"
echo 記録完了: %LOGFILE%
endlocal
schtasks で1時間ごとに定期実行するタスクを登録
@echo off

REM 1時間ごとに net_record.bat を実行するタスクを登録
schtasks /create ^^
  /tn "NetworkIPLogger" ^^
  /tr "C:\scripts\net_record.bat" ^^
  /sc hourly ^^
  /mo 1 ^^
  /ru "%USERNAME%" ^^
  /f

echo タスク登録完了
schtasks /query /tn "NetworkIPLogger" /fo LIST
関連記事
ネットワーク接続の有無を確認して処理を分岐する方法はネットワーク接続判定・ping・リトライループ完全ガイド、日付別ファイルへのログ保存全般はログを日付別ファイルに自動保存する完全ガイド、実行時刻の記録・経過時間計算は実行時刻・経過時間をログに記録する完全ガイドを参照してください。

まとめ

  • 基本: ipconfig | findstr "IPv4" + for /f "tokens=2 delims=:" で抽出
  • NIC絞り込み: セクション名を検出して対象アダプターのIPのみ取得
  • wmic: where "IPEnabled=True" でIP・MAC・ゲートウェイを一括取得
  • PowerShell: Get-NetIPAddress でループバック除外・NIC絞り込みを簡潔に実装
  • 変更検知: キャッシュファイルと比較して差分のみログに記録(DHCP環境の変動追跡)
  • 定期記録: schtasks /sc hourly で1時間ごとにネットワーク情報をログ保存

関連記事: ネットワーク接続の有無を判定する方法 / ネットワーク接続を監視して異常検知・再接続する方法 / バッチファイルでログを出力する完全ガイド

よくある質問(FAQ)

Qipconfig | findstr “IPv4” で複数行出力されます。特定のIPだけを取りたいです。
AWi-Fi・イーサネット・仮想NICなど複数のアダプターがあると複数行出力されます。対処法は2つあります。①セクション名で絞り込む(本記事「NICを絞り込んで取得する」参照)、②PowerShell の Get-NetIPAddress -InterfaceAlias "Wi-Fi" でアダプター名を直接指定する。まず ipconfig を実行して目的のアダプター名を確認してから絞り込んでください。
Q取得したIPアドレスの前後にスペースが入ります。
Aipconfig の出力は IPv4 アドレス. . . : 192.168.1.100 のようにコロンの後にスペースがあります。tokens=2 delims=: でコロン以降を取得すると先頭にスペースが残るため、set IP=!IP:~1!(先頭1文字を除去)で対処します。wmic や PowerShell を使うとスペース処理が不要になります。
QVPNを使うとIPが変わります。VPN接続前後のIPを両方記録したいです。
Aipconfig | findstr "IPv4" ではすべてのNICのIPが出力されます。ループを使わずすべての行を >> でログに書き出すことでVPNアダプターを含む全IPを記録できます。また ipconfig /all >> log.txt でフル情報を記録する方法も簡便です。
QグローバルIPアドレス(外部から見えるIP)を取得したいです。
Aipconfig や wmic で取得できるのはローカルIPアドレス(プライベートIP)です。グローバルIPはルーターのNATを経由するため端末からは直接取得できません。powershell -Command "(Invoke-WebRequest -Uri 'https://api.ipify.org').Content" のように外部サービスに問い合わせる方法があります。ただしネットワーク接続が必要です。
Qwmic コマンドが Windows 11 で「非推奨」と表示されます。
AWindows 11 では wmic が非推奨(Deprecated)となり、将来のバージョンで廃止される予定です。現時点では引き続き動作しますが、長期的な安定性を求める場合はGet-NetIPAddressGet-NetAdapter などの PowerShell コマンドレットへの移行が推奨されます。