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

  • 質問

  • コマンドプロンプトで、同じネットワーク上のものにpingを打ち、

    arp-a を実行するとIPアドレス一覧が表示されるかと思います。

    これを自動で行いたいと思います。

    コマンドプロンプトで実行できるbatにしようと思っている為

    せっかくなら、全対象にしたいと思ってます。(Windows XP,Windows7)

    バッチファイルを実行すると自分のIPアドレスを取得し

    最後の数字以外を取得して forループで回してpingを打ち、arp-aで起動しているIPアドレスを取得…。

    ----------------------------------------
    cd c:\
    pause

    call :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=0

    for /l %i in (1,1,15) do if ("!MyIP:~-%%i,1%" EQU '.' exit for)


    pause

    for /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

回答

  • FOR /F "usebackq tokens=2 delims=:" %i IN (`ipconfig^|findstr /c:"IPv4"`) Do @echo %i
    2014年12月28日 14:24
  • チャブーンです。

    どうしても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=0

    for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IP Address"`) do (
     set MyIP=%%i)
    pause

    IF "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

すべての返信

  • こんにちは、さとこんぶ さん
    フォーラムオペレータの佐伯 玲 です。

    ご投稿いただいている「TechNet サブスクリプション」フォーラムはTechNet サブスクリプションに関するご質問をしていただくためのフォーラムとなっております。
    ご記載されている内容から一番近いフォーラムは「Windows 7 全般」フォーラムかと思いますので私のほうでスレッドを移動させていただきますね。


    宜しくお願い致します。

    TechNet Community Support 佐伯 玲

    2014年12月18日 4:13
  • チャブーンです。

    どうしても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.%%k

    pause

    --------------------------------------------

    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
  • FOR /F "usebackq tokens=2 delims=:" %i IN (`ipconfig^|findstr /c:"IPv4"`) Do @echo %i
    2014年12月28日 14:24
  • @echo off
     setlocal enabledelayedexpansion
     set /a cnt=0

    for /f "usebackq delims=: tokens=2*" %%i in (`ipconfig.exe ^| findstr.exe /r /c:"IP Address"`) do (
     set MyIP=%%i)
    pause

    IF "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