バッチファイルで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 で絞込) | インターフェース名・プレフィックス長 |
Wi-Fi・イーサネット・VPN・仮想NIC(VMware/Hyper-V)が混在する環境では
ipconfig | findstr "IPv4" を使うと複数の行が返ります。意図したNICのIPを確実に取得するには アダプター名での絞り込みが必要です。基本:ipconfig でIPv4アドレスを取得してログに記録する
最もシンプルな実装です。for /f で ipconfig の出力から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 のシングルクォート内でパイプ | を使うには^| のようにキャレットでエスケープする必要があります。エスケープを忘れると | が外側のコマンドのパイプとして解釈されエラーになります。NICを絞り込んでIPを取得する(Wi-Fi / イーサネット)
複数NICがある環境では、セクション名(アダプター名)でフィルタリングして目的のNICの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
日本語環境では「イーサネット アダプター イーサネット」「Wi-Fi アダプター Wi-Fi」、英語環境では「Ethernet adapter Ethernet」「Wireless LAN adapter Wi-Fi」のように表示されます。まず
ipconfig を実行してアダプター名を確認し、TARGET_ADAPTER に設定してください。wmic でIP・MAC・ゲートウェイを一括取得する
wmic nicconfig を使うと 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
@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 フィールドは {"192.168.1.100","fe80::..."} のような配列形式で返ります。delims={} で中身を取り出した後、カンマ区切りの1番目がIPv4アドレスです。ダブルクォートは set VAR=!VAR:"=! で除去できます。PowerShell でシンプルかつ確実にIPを取得する
PowerShell の Get-NetIPAddress コマンドレットを使うと簡潔なコードで確実にIPv4アドレスを取得できます。ループバック(127.x.x.x)や仮想NICを除外することも容易です。
@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
@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アドレスの変動履歴を効率的に管理できます。
@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_last.txt に前回のIPを保存しておき、現在のIPと比較します。初回実行時はキャッシュファイルがないため PREV_IP が空になり、必ずログに記録されます。これを利用して「初回実行時に現在のIPを記録する」動作としても活用できます。このバッチをタスクスケジューラで定期実行することで、DHCPによるIP変動の履歴を自動記録できます。実践:定期実行用のネットワーク情報記録バッチ
これまでの手法を組み合わせた、タスクスケジューラで定期実行する実践的なネットワーク情報記録バッチです。IP・MACアドレス・ゲートウェイを日付別ファイルに記録します。
@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
@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)
Get-NetIPAddress -InterfaceAlias "Wi-Fi" でアダプター名を直接指定する。まず ipconfig を実行して目的のアダプター名を確認してから絞り込んでください。ipconfig の出力は IPv4 アドレス. . . : 192.168.1.100 のようにコロンの後にスペースがあります。tokens=2 delims=: でコロン以降を取得すると先頭にスペースが残るため、set IP=!IP:~1!(先頭1文字を除去)で対処します。wmic や PowerShell を使うとスペース処理が不要になります。ipconfig | findstr "IPv4" ではすべてのNICのIPが出力されます。ループを使わずすべての行を >> でログに書き出すことでVPNアダプターを含む全IPを記録できます。また ipconfig /all >> log.txt でフル情報を記録する方法も簡便です。ipconfig や wmic で取得できるのはローカルIPアドレス(プライベートIP)です。グローバルIPはルーターのNATを経由するため端末からは直接取得できません。powershell -Command "(Invoke-WebRequest -Uri 'https://api.ipify.org').Content" のように外部サービスに問い合わせる方法があります。ただしネットワーク接続が必要です。Get-NetIPAddress・Get-NetAdapter などの PowerShell コマンドレットへの移行が推奨されます。

