トップ回答者
同じネットワーク上で、起動しているPCのIPアドレスを出力したい (全台にping arp-aで取得)

質問
-
コマンドプロンプトで、同じネットワーク上のものにpingを打ち、
arp-a を実行するとIPアドレス一覧が表示されるかと思います。
これを自動で行いたいと思います。
コマンドプロンプトで実行できるbatにしようと思っている為
せっかくなら、全対象にしたいと思ってます。(Windows XP,Windows7)
バッチファイルを実行すると自分のIPアドレスを取得し
最後の数字以外を取得して forループで回してpingを打ち、arp-aで起動しているIPアドレスを取得…。
----------------------------------------
cd c:\
pausecall :GET_IP_ADDRESSES
if defined MyIP1 echo IP1: %ipaddress%
goto EOF:GET_IP_ADDRESSES
for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IPv4 .*"`) do (
set MyIP=%%i):EOF
echo %MyIP%
pause
set /a count=0for /l %i in (1,1,15) do if ("!MyIP:~-%%i,1%" EQU '.' exit for)
pausefor /l %i in (1,1,254) do ping -w 50 -n 1 192.168.1.%i
arp -a > AllIPAddress.txt-------------------------------------
色々調べて、考えてみました。
for /l %i in (1,1,15) do if ("!MyIP:~-%%i,1%" EQU '.' exit for)
これは、私が考えて書いてみたものなので、うまくいかないと思います。
何か、もう少しスマートなやり方があると思うのですが
何か良い案は無いでしょうか?
batじゃなくても、VBSでも良いです。
他のソフトをインストールすることなく、確認できたら良いなと思ってます。
以上、回答お待ちしております。
- 移動 佐伯玲 2014年12月18日 4:13 TechNet サブスクリプション から Windows 7 全般 へ
2014年12月18日 1:16
回答
-
チャブーンです。
どうしてもMS DOSですべてを行いたい、という場合、したのような方法で「ネットワーク部分の値」は変数に入れられると思います。(Windows XPが前提のコマンドです)
FOR /F "usebackq tokens=15 delims= " %i IN (`ipconfig^|findstr c:"IP Address"`) Do @set IPAD=%i FOR /F "usebackq tokens=1,2,3 delims=." %i IN (`echo %IPAD%`) Do @set NETAD=%i.%j.%k.
うえの段は、半角スペースを区切り文字としてipconfigコマンドの"IP Address"の行文字列全体から"192.168.1.10"といったクライアントのIPアドレス文字列を取得します。
したの段は、半角ドットを区切り文字として、うえで取得した文字列の3オクテット数字部分を各変数(%i,%j,%k)に代入し、最後に"<最初のオクテット>.<2つ目のオクテット>.<3つ目のオクテット>."という形式になるよう、新たな変数NETADに値を設定しています。この値は(例に倣えば)"192.168.1."になるはずです。
これでご要望の最低ラインは満たせるように、思います。念のため注意点ですが、うえはコマンドラインで実行する前提なので実際にバッチにするには、変数部分の「%」を2つ重ねる等の修正をご自身で行ってください。
2014年12月19日 4:32 -
@echo off
setlocal enabledelayedexpansion
set /a cnt=0for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IP Address"`) do (
set MyIP=%%i)
pauseIF "aaa"%MyIP% EQU "aaa" (
for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IPv4 .*"`) do (
set MyIP=%%i
))
call :ipDsub
echo %MyIP%
echo %ipAddress%
echo --------
for /l %%i in (1,1,30) do ping -w 50 -n 1 %ipAddress%.%%i
arp -a > AllIPAddress.txt
echo --------
echo AllIPAddress.txtとして保存しました。
pause:ipDsub
echo.
set /a cnt=0
set flgCnt=0
set ipaddress=
:ipDsub2
set add=!MyIP:~%cnt%,1!
if "%add%"=="." (set /a flgCnt+=1
rem echo %flgCnt%
)
if %flgCnt% EQU 3 (exit /b)
if "%add%" EQU "" (
set ipaddress=This is cast error :MyIP="%MyIP%"!
exit /b)
set /a cnt+=1
set ipaddress=%ipaddress%%add%
rem echo %ipAddress%
goto :ipDsub2このようにしてみました。うまくいきました!
2014年12月29日 7:05
すべての返信
-
チャブーンです。
どうしてもMS DOSですべてを行いたい、という場合、したのような方法で「ネットワーク部分の値」は変数に入れられると思います。(Windows XPが前提のコマンドです)
FOR /F "usebackq tokens=15 delims= " %i IN (`ipconfig^|findstr c:"IP Address"`) Do @set IPAD=%i FOR /F "usebackq tokens=1,2,3 delims=." %i IN (`echo %IPAD%`) Do @set NETAD=%i.%j.%k.
うえの段は、半角スペースを区切り文字としてipconfigコマンドの"IP Address"の行文字列全体から"192.168.1.10"といったクライアントのIPアドレス文字列を取得します。
したの段は、半角ドットを区切り文字として、うえで取得した文字列の3オクテット数字部分を各変数(%i,%j,%k)に代入し、最後に"<最初のオクテット>.<2つ目のオクテット>.<3つ目のオクテット>."という形式になるよう、新たな変数NETADに値を設定しています。この値は(例に倣えば)"192.168.1."になるはずです。
これでご要望の最低ラインは満たせるように、思います。念のため注意点ですが、うえはコマンドラインで実行する前提なので実際にバッチにするには、変数部分の「%」を2つ重ねる等の修正をご自身で行ってください。
2014年12月19日 4:32 -
回答頂きありがとうございます。
echoで変数を表示させようと思ったのですが表示できず…
実行できているのか確認できていない状況です。(たぶん、うまくいっていない)
-------------------------------------------
FOR /F "usebackq tokens=15 delims= " %%i IN (`ipconfig^|findstr c:"IP Address"`) Do @set IPAD=%%i
FOR /F "usebackq tokens=1,2,3 delims=." %%i IN (`echo %IPAD%`) Do @set NETAD=%%i.%%j.%%k.
echo %%i.%%j.%%kpause
--------------------------------------------
1行目のみでも試してみたのですが、表示されません。
FOR /F "usebackq tokens=15 delims= " %i IN (`ipconfig^|findstr c:"IP Address"`) Do @echo %i
XPパソコンで、上記文をコマンドプロンプトにコピペし、実行しましたがこれも見れませんでした。
何が原因でしょうか?
わかりましたら、教えて下さい。よろしくお願い致します。
2014年12月25日 2:38 -
チャブーンです。
「まったく表示されない」ということでしたら、コマンドの書き方が間違っている可能性があります。
FOR /F "usebackq tokens=15 delims=<半角スペース1つ>" %i IN (`ipconfig^|findstr c:"IP Address"`) Do @echo %i
delimsの項目に半角スペースがない、あるいは2つ以上の半角スペースが連なってしまっている場合、予想した内容となりません。delims=<半角スペース1つ>の直後を「"」で閉じる必要があります。コマンドのコピペはやめて、一文字ずつ手打ちして確認してみてください。
もしこれでダメな場合、OSの言語(日本語版と英語版の違い等)の違いで異なる文字列が出力されている可能性がありますので、ipconfig|findstr c:"IP Address"で出力される文字列全体を確認する必要があります。
2014年12月25日 5:45 -
@echo off
setlocal enabledelayedexpansion
set /a cnt=0for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IP Address"`) do (
set MyIP=%%i)
pauseIF "aaa"%MyIP% EQU "aaa" (
for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IPv4 .*"`) do (
set MyIP=%%i
))
call :ipDsub
echo %MyIP%
echo %ipAddress%
echo --------
for /l %%i in (1,1,30) do ping -w 50 -n 1 %ipAddress%.%%i
arp -a > AllIPAddress.txt
echo --------
echo AllIPAddress.txtとして保存しました。
pause:ipDsub
echo.
set /a cnt=0
set flgCnt=0
set ipaddress=
:ipDsub2
set add=!MyIP:~%cnt%,1!
if "%add%"=="." (set /a flgCnt+=1
rem echo %flgCnt%
)
if %flgCnt% EQU 3 (exit /b)
if "%add%" EQU "" (
set ipaddress=This is cast error :MyIP="%MyIP%"!
exit /b)
set /a cnt+=1
set ipaddress=%ipaddress%%add%
rem echo %ipAddress%
goto :ipDsub2このようにしてみました。うまくいきました!
2014年12月29日 7:05