web-dev-qa-db-ja.com

IPアドレスをバッチファイル変数に取得するにはどうすればよいですか?

奇妙な質問がありますが、可能かどうかはわかりません。

スクリプトを書きたいです。たとえば、ipconfigをコマンドとして使用します。

このコマンドを通常実行すると、大量の出力があります。

たとえば、IPアドレスのみを表示するスクリプトが必要です。

echo Network Connection Test
ipconfig <---This would run in the background
echo Your IP Address is: (INSERT IP ADDRESS HERE)

出力は次のようになります

Network Connection Test

Your IP Address is: 192.168.1.1

これも可能ですか?

44
level42

これにより、ipconfigの出力にIPアドレスが出力されます。

@echo off
set ip_address_string="IPv4 Address"
rem Uncomment the following line when using older versions of Windows without IPv6 support (by removing "rem")
rem set ip_address_string="IP Address"
echo Network Connection Test
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do echo Your IP Address is: %%f

最初のIPアドレスのみを印刷するには、エコーの後に、または読みやすい形式でgoto :eof(または:eofの代わりにジャンプする別のラベル)を追加するだけです。

set ip_address_string="IPv4 Address"
rem Uncomment the following line when using older versions of Windows without IPv6 support (by removing "rem")
rem set ip_address_string="IP Address"
for /f "usebackq tokens=2 delims=:" %%f in (`ipconfig ^| findstr /c:%ip_address_string%`) do (
    echo Your IP Address is: %%f
    goto :eof
)

より構成可能な方法は、ipconfig /allの出力を実際に少し解析することです。この方法では、IPアドレスが必要なアダプターを指定することもできます。

@echo off
setlocal enabledelayedexpansion
::just a sample adapter here:
set "adapter=Ethernet adapter VirtualBox Host-Only Network"
set adapterfound=false
echo Network Connection Test
for /f "usebackq tokens=1-2 delims=:" %%f in (`ipconfig /all`) do (
    set "item=%%f"
    if /i "!item!"=="!adapter!" (
        set adapterfound=true
    ) else if not "!item!"=="!item:IP Address=!" if "!adapterfound!"=="true" (
        echo Your IP Address is: %%g
        set adapterfound=false
    )
)
39
mousio

次のコードは、Windows XP以降の任意のプラットフォームの任意のロケールで動作しネットワークIP(おおよそ)ランダムなネットワークカードから。数ミリ秒より長くかかることはありません。

for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do set NetworkIP=%%a
echo Network IP: %NetworkIP%

以下は、代わりにパブリックIPを探し、Windows 7以降のマシンで動作します。

for /f %%a in ('powershell Invoke-RestMethod api.ipify.org') do set PublicIP=%%a
echo Public IP: %PublicIP%  

これらのコマンドの詳細な説明は my blog にあります。

49
Fabio Iotti

Windows 7の場合:

for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1%
echo %ip%
pause
16
OptekProduction

アドレスをすべて単独で抽出するのは少し難しいですが、IPアドレス行全体を簡単に取得できます。

英語版Windows OSですべてのIPアドレスを表示するには:

ipconfig | findstr /R /C:"IP.* Address"

Windows 7以降でIPv4またはIPv6アドレスのみを表示するには:

ipconfig | findstr /R /C:"IPv4 Address"

ipconfig | findstr /R /C:"IPv6 Address"

3つのネットワークアダプタを備えたXPマシンからの出力例を次に示します。

        IP Address. . . . . . . . . . . . : 192.168.1.10
        IP Address. . . . . . . . . . . . : 10.6.102.205
        IP Address. . . . . . . . . . . . : 192.168.56.1
13
indiv
@echo off

FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i

echo Your IP Address is: %localIp%
12

これは、仮想ネットワークアダプターまたはVPN接続がある場合でも機能します。

FOR /F "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i
echo Your IP Address is: %localIp%
4
SergeyA

これは@mousioの答えの修正です。私のネットワーク接続は永続的ではないため、文字列「IPv4 Address」がipconfigにない場合、次のアダプターのIPアドレスが表示されます。 ipconfigの結果には、アダプター間に2つの空白スペースがあります。アダプターが検出され、「IPv4アドレス」テキストの前に2行の空白行が発生した後、アダプターが欠落していると見なされます。 Windows 7 64ビットのみでテスト済み。

@dbenhamの回答からの空白行の処理: FIND.exeを使用したDOSバッチFORループは空白行を削除していますか?

@echo off

rem --- complete adapter name to find without the ending ":" ---
set adapter=Wireless LAN adapter Wireless Network Connection

rem --- token under an adapter to extract IP address from ---
set IPAddrToken=IPv4 Address

setlocal enableextensions enabledelayedexpansion
set adapterfound=false
set emptylines=0
set ipaddress=

for /f "usebackq tokens=1-3 delims=:" %%e in (`ipconfig ^| findstr /n "^"`) do (

    set "item=%%f"

    if /i "!item!"=="!adapter!" (
        set adapterfound=true
        set emptylines=0
    ) else if not "!item!"=="" if not "!item!"=="!item:%IPAddrToken%=!" if "!adapterfound!"=="true" (
        @rem "!item:%IPAddrToken%=!" --> item with "IPv4 Address" removed
        set ipaddress=%%g
        goto :result
    )
    if "%%f-%%g-!adapterfound!-!emptylines!"=="--true-1" (
        @rem 2nd blank line after adapter found
        goto :result
    )
    if "%%f-%%g-!adapterfound!-!emptylines!"=="--true-0" (
        @rem 1st blank line after adapter found
        set emptylines=1
    )
)

endlocal

:result
    echo %adapter%
    echo.
    if not "%ipaddress%"=="" (
        echo    %IPAddrToken% =%ipaddress%
    ) else (
        if "%adapterfound%"=="true" (
            echo    %IPAddrToken% Not Found
        ) else (
            echo    Adapter Not Found
        )
    )
    echo.

pause
3
Ian

ローカルホストに加えてリモートホストのIPを取得する柔軟性が必要な場合を除き、IPCONFIGを使用するのが適切です。 PINGを使用してwww.google.comなどから取得するには:

for /f "tokens=2 delims=[]" %%f in ('ping -4 -n 1 www.google.com ^|find /i "pinging"') do echo IP=%%f

その例の結果は次のとおりです。

IP=173.194.73.106

ローカルホストの最初のIPを取得するには、引用符なしで「www.google.com」を「%computername%」に置き換えます。前の「-4」は、可能なIPv6アドレスではなく、常にIPv4アドレスを取得することに注意してください。必要に応じて省略します。また、この手法では複数のIPアドレスを取得できないことに注意してください。それが目標である場合、NSLOOKUPを追加のコードとともに使用する必要があります。

PINGの代わりにNSLOOKUPを使用し、ホストに複数のIPアドレスがある場合、各アドレスはコンマで区切られるため、変数の最後にコンマがあります。

2
Lizz

私はこれが古い投稿であることを知っていますが、vbscriptで同じ問題を解決しようとしているときにこれに出くわしました。複数のネットワークアダプターでこれをテストしたことはありませんが、それでも役に立つことを願っています。

for /f "delims=: tokens=2" %%a in ('ipconfig ^| findstr /R /C:"IPv4 Address"') do (set tempip=%%a)  
set tempip=%tempip: =%  
echo %tempip%

これはWin7を想定しています。 XPの場合、IPv4 AddressIP Addressに置き換えます。

2
skywalkr73

Windowsの1行コマンド IPアドレスを取得します。

for /F "tokens=14" %%i in ('"ipconfig | findstr IPv4"') do SET LOCAL_IP=%%i

このコマンドの後、echo %LOCAL_IP%はIPアドレスを出力します。または、%LOCAL_IP%をバッチスクリプトの参照変数として使用できます

1
vkrams

あなたが言及するようにWindows OSを想定してipconfig

GrepのwindowsポートなどのUnixyユーティリティをインストールする場合は、それを実行できます。ただし、ipconfigを使用した例のような場合、複数のNICまたはVMWareなどのマシンでは混乱になります。

Powershellはあなたが望むツールかもしれません。例として here を見てください。

1
fvu

Linux環境の場合:

ip="$(ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -d ':' -f 2)"

または

ip="$(ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -d ':' -f 2)" | echo $ip

freeBSDの例:

ifconfig re0 | grep -v "inet6" | grep -i "inet" | awk '{print $2}'

複数のIPアドレスが構成されている場合、stdoutには複数のIPアドレスがあります。

0
Jonny_Starky

以下はすべて、Windows XPボックスのcygwinで行われました。

これにより、IPアドレスが取得されます。単一引用符ではなく、hostnameコマンドの前後に逆引用符があることに注意してください。

ping -n 1 `hostname` | grep "Reply from " | cut -f 3 -d " " | cut -f 1 -d ":"

これにより、サブネットが取得されます。

ping -n 1 `hostname` | grep "Reply from " | cut -f 3 -d " " | cut -f "1 2 3" -d "."

以下は、ローカルネットワーク上のすべてのホストをリストします(「netmap」と呼ばれるスクリプトに入れます)。上記のサブネット行を取得して、「getsubnet」という実行可能ファイルに配置し、次のスクリプトから呼び出しました。

MINADDR=0
MAXADDR=255
SUBNET=`getsubnet`

hostcnt=0

echo Pinging all addresses in ${SUBNET}.${MINADDR}-${MAXADDR}

for i in `seq $MINADDR $MAXADDR`; do
addr=${SUBNET}.$i
ping -n 1 -w 0 $addr > /dev/null

if [ $? -ne 1 ]    
then    
echo $addr UP    
hostcnt=$((hostcnt+1))    
fi

done

echo Found $hostcnt hosts on subnet ${SUBNET}.${MINADDR}-${MAXADDR}
0
Paul McNabb

Ipconfigコマンドを使用してIPv4を取得します。

ヘルプリンク= for /?

ヘルプ= ipconfig /?

ここに私の方法=

for /f "tokens=1-2 delims=:" %%a in ('ipconfig ^|find "IPv4"') do set Oo=%%b
Echo %Oo%
cd "%ProgramFiles%\Mozilla Firefox"
Firefox.exe %Oo%
0
scientist_7

以下のスクリプトは、ipアドレスを変数ip_addressに保存します

@echo off

call :get_ip_address
echo %ip_address%

goto :eof

REM
REM get the ip address
REM
:get_ip_address
FOR /f "tokens=1 delims=:" %%d IN ('ping %computername% -4 -n 1 ^| find /i "reply"') do (FOR /F "tokens=3 delims= " %%g IN ("%%d") DO set ip_address=%%g)

goto :eof

このブログ投稿 からのアイデア。

0
Mingjiang Shi