web-dev-qa-db-fra.com

Comment obtenir l'adresse IP dans une variable de fichier de traitement par lots?

J'ai une question étrange, pas sûr si c'est possible.

J'aimerais écrire un script et, par exemple, je vais utiliser ipconfig comme commande.

Maintenant, lorsque vous exécutez normalement cette commande, vous obtenez une tonne de sortie.

Ce que j'aimerais avoir, c'est un script qui ne montrerait que l'adresse IP, par exemple.

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

La sortie serait

Network Connection Test

Your IP Address is: 192.168.1.1

Est-ce seulement possible?

44
level42

Ceci affichera les adresses IP dans le résultat de ipconfig:

@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

Pour n'imprimer que la première adresse IP, ajoutez simplement goto :eof (ou une autre étiquette à laquelle sauter directement au lieu de :eof) après l'écho ou sous une forme plus lisible:

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
)

Une méthode plus configurable consisterait à analyser la sortie de ipconfig /all un peu, vous pourrez même spécifier l’adaptateur dont vous voulez l’adresse 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

Le code suivant fonctionne sur tous les paramètres régionaux de n’importe quelle plate-forme depuis Windows XP et il recherche l’adresse IP du réseau sur un (plus ou moins) aléatoire de vos cartes réseau. Cela ne prendra jamais plus de quelques millisecondes.

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

Le suivant cherche votre IP publique à la place et fonctionne sur Windows 7 et les machines plus récentes.

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

Vous pouvez trouver des explications détaillées sur ces commandes sur mon blog .

49
Fabio Iotti

Sous 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

Extraire l’adresse elle-même est un peu difficile, mais vous pouvez obtenir toute la ligne d’adresses IP facilement.

Pour afficher toutes les adresses IP sur n’importe quel système d’exploitation Windows de langue anglaise:

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

Pour afficher uniquement les adresses IPv4 ou IPv6 sous Windows 7+:

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

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

Voici un exemple de sortie d’une machine XP avec 3 adaptateurs réseau.

        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

Cela fonctionne même si vous avez des cartes réseau virtuelles ou des connexions 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

Ceci est une modification de la réponse de @ mousio. Ma connexion réseau n'est pas persistante. Par conséquent, l'adresse IP de l'adaptateur suivant s'affiche si la chaîne "Adresse IPv4" est manquante dans ipconfig. Le résultat de ipconfig comporte 2 espaces vides entre les adaptateurs. Une fois qu'un adaptateur est trouvé et que deux lignes vierges apparaissent avant le texte "Adresse IPv4", cela suppose qu'il est manquant. Testé sous Windows 7 64 bits uniquement.

Traitement des lignes vides de la réponse de @ dbenham en: La boucle FOR batch DOS avec FIND.exe supprime les lignes vides?

@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

Utiliser IPCONFIG est une bonne chose, à moins que vous ne souhaitiez avoir la possibilité d'obtenir l'adresse IP d'un hôte distant en plus de l'hôte local. Pour l'obtenir à partir de quelque chose comme www.google.com en utilisant PING, essayez:

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

Le résultat de cet exemple est:

IP=173.194.73.106

Pour obtenir la première adresse IP de votre hôte local, remplacez "www.google.com" par "% nomordinateur%" sans les guillemets. Notez que le "-4" devant obtiendra toujours l'adresse IPv4 au lieu d'une adresse IPv6 possible. Omettre au besoin. Notez également que cette technique ne peut pas obtenir plus d'une adresse IP. Si tel est votre objectif, vous devrez utiliser NSLOOKUP avec du code supplémentaire.

Remarquez que si vous utilisez NSLOOKUP au lieu de PING et que l'hôte a plus d'une adresse IP, votre variable aura une virgule à la fin, chaque adresse étant séparée par une virgule.

2
Lizz

Je sais que c'est un article plus ancien, mais je l'ai rencontré en essayant de résoudre le même problème avec vbscript. Je n'ai pas testé cela avec plusieurs adaptateurs réseau, mais j'espère que cela sera néanmoins utile.

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

Cela suppose Win7. Pour XP, remplacez IPv4 Address avec IP Address.

2
skywalkr73

commande sur une ligne sous Windows pour obtenir l'adresse IP.

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

Après cette commande echo %LOCAL_IP% imprimera l'adresse IP. Ou vous pouvez utiliser %LOCAL_IP% comme variable de référence dans votre script batch

1
vkrams

En supposant un système d’exploitation Windows lorsque vous mentionnez i p config

Si vous êtes prêt à installer des utilitaires Unixy comme un port Windows de grep et cut, vous pouvez le faire. Toutefois, dans des cas tels que votre exemple avec ipconfig, il en résultera un désordre dans les ordinateurs dotés de plusieurs cartes réseau ou de VMWare.

Powershell pourrait être l'outil que vous voulez, regardez ici pour un exemple.

1
fvu

En environnement linux:

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

ou

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

exemple sous FreeBSD:

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

Si vous avez plus d'une adresse IP configurée, vous aurez plus d'une adresse IP dans stdout.

0
Jonny_Starky

Tout ce qui suit a été fait en cygwin sur une boîte Windows XP).

Cela va obtenir votre adresse IP. Notez que la commande hostname contient des guillemets arrières, et non des guillemets simples.

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

Cela va obtenir votre sous-réseau.

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

La liste suivante répertorie tous les hôtes de votre réseau local (placez-le dans un script appelé "netmap"). J'avais pris la ligne de sous-réseau ci-dessus et l'avais placée dans un exécutable appelé "getsubnet", que j'ai ensuite appelé à partir du script suivant.

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

Vous utilisez la commande ipconfig pour obtenir IPv4.

Lien d'aide = for /?

Aide = ipconfig /?

Voici mon chemin =

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

Le script ci-dessous stockera l'adresse IP dans la variable 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

Idées de cet article de blog .

0
Mingjiang Shi