DosTips.com

A Forum all about DOS Batch
It is currently 18 Oct 2017 05:24

All times are UTC-06:00




Post new topic  Reply to topic  [ 5 posts ] 
Author Message
PostPosted: 14 Feb 2017 10:04 
Offline

Joined: 04 Feb 2017 22:03
Posts: 9
Hi. I've written some very simple batch files, but I'm a bit of a newbie.

I want to run "ipconfig", and put the gateway IP address into a variable. I found this solution on another forum:

Code: Select all
set "ip="
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "Default"') do if not defined ip set ip=%%b

http://stackoverflow.com/questions/2236 ... batch-file

It works perfectly for me, but I simply don't understand it! :? Can anyone explain it to me (very slowly)?

Ideally, I want the script to work on any version of Windows (and in any region). Will this line of code work on any version of Windows (or at least XP onwards)? And, am I right in thinking that searching for the text "Default" would only work if the language was set to English? If so, are there any other ways to get the gateway IP? Ooh -- and will this work if the gateway uses IPv6 instead of IPv4?

Sorry -- so many questions! Any little tips or hints would be greatly appreciated! :D

EDIT: I just found this link, which goes a long way to explain what's happening. I'm going to need to re-read it a dozen times to wrap my head round it, I think!

https://blogs.msdn.microsoft.com/oldnew ... 00/?p=7003


Top
   
PostPosted: 14 Feb 2017 12:15 
Offline
Expert

Joined: 22 Jan 2010 18:01
Posts: 2945
Location: Germany
esuhl wrote:
It works perfectly for me, but I simply don't understand it! :? Can anyone explain it to me (very slowly)?

Have a look at the output of IPCONFIG in a CMD window to understand how it works.
ipconfig|find "Default" is a filter that let pass only lines that contain "Default". The extra caret (^) in front of the pipe (|) is necessary because the line will be parsed twice. 1st in the batch code, 2nd as command line in a separate cmd.exe instance run in the FOR loop.
The output of this command line will be processed in the FOR /F loop where the first and the second substring (see tokens) separated by a colon (see delims) will be accessible in the FOR variables. The first substring will be saved in %%a. Thus, the second substring (that is, the IP address) will be saved in %%b. The reason why variable ip was undefined in the first line is to make sure only the first found IP address is set to variable ip (after that ip is defined and the if not defined protects it from overwriting).

esuhl wrote:
Ideally, I want the script to work on any version of Windows (and in any region).

No way. The output of IPCONFIG is highly language-dependent. Default gateway IP address if I run it:
Code: Select all
   Standardgateway . . . . . . . . . : 192.168.178.1


You may try ...
Code: Select all
for /f "delims={}," %%i in ('wmic nicconfig where ipenabled^=true get defaultipgateway^|find "{"') do set "ip=%%~i"

... that should be language-independent. Although WMIC was not suported on some XP versions.

Steffen


Top
   
PostPosted: 14 Feb 2017 13:08 
Offline

Joined: 04 Feb 2017 22:03
Posts: 9
Excellent! Thanks for the links and explanation. I'll have a proper read through and another play around. That's just the kind of stuff I wanted to know!

One quick question... I saw that there are some functions (code snippets) on this site. One is a function called :getIPConfig, which puts IPCONFIG /ALL data into an array:
http://www.dostips.com/DtCodeCmdLib.php ... etIPConfig

This is probably a really stupid question, but... I can't figure out how to use it. :oops:

What is the name of the array that the function creates? Or do I need to somehow create an array, and pass it to the function to populate with IPCONFIG data...?

Thanks again :-)


Top
   
PostPosted: 14 Feb 2017 13:50 
Offline
Expert

Joined: 23 Dec 2011 13:59
Posts: 3590
esuhl wrote:
One quick question... I saw that there are some functions (code snippets) on this site. One is a function called :getIPConfig, which puts IPCONFIG /ALL data into an array:
http://www.dostips.com/DtCodeCmdLib.php ... etIPConfig

This is probably a really stupid question, but... I can't figure out how to use it. :oops:

What is the name of the array that the function creates? Or do I need to somehow create an array, and pass it to the function to populate with IPCONFIG data...?

Thanks again :-)


Well I don't know how useful it is. It creates a pseduo array of environmental variables.

Code: Select all
@echo off

call :getIPConfig arr
set arr
pause
goto :eof


:getIPConfig arr -- return IPCONFIG /ALL data in array variable
::               -- arr [out] - target array variable for IPCONFIG data
:$created 20091111 :$changed 20091111 :$categories Network,Array
:$source http://www.dostips.com
if "%~1" NEQ "" for /f "delims==" %%A in ('set %~1[ 2^>NUL') do @set "%%A="
SETLOCAL ENABLEDELAYEDEXPANSION
set "data="
set /a n=0
for /f "tokens=1,* delims=:" %%A in ('ipconfig /all^|find ":"') do (
    set "v=%%~A "
    if "!v:~0,8!" NEQ "        " (
        rem it's a new section
        set /a n+=1
        set "data=!data!&set %~1[!n!].DisplayName=%%A"
    ) ELSE (
        set "v=!v:~8!"
        set "v=!v:.=!"
        set "v=!v: =!"
        set "x=%%~B"
        set "data=!data!&set %~1[!n!].!v!=!x:~1!"
    )
)
set "data=rem.%data:)=^)%"
( ENDLOCAL & REM RETURN VALUES
    %data%
    SET "%~1[#]=%n%"
)
EXIT /b


Top
   
PostPosted: 14 Feb 2017 14:05 
Offline
Expert

Joined: 22 Jan 2010 18:01
Posts: 2945
Location: Germany
This function doesn't even work for me. There are only three preceding blanks in my output of IPCONFIG /ALL
Code: Select all
@echo off
call :getIPConfig arr
for /l %%i in (1 1 %arr[#]%) do set arr[%%i]
pause
exit /b

:getIPConfig arr -- return IPCONFIG /ALL data in array variable
::               -- arr [out] - target array variable for IPCONFIG data
:$created 20091111 :$changed 20091111 :$categories Network,Array
:$source http://www.dostips.com
if "%~1" NEQ "" for /f "delims==" %%A in ('set %~1[ 2^>NUL') do @set "%%A="
SETLOCAL ENABLEDELAYEDEXPANSION
set "data="
set /a n=0
for /f "tokens=1,* delims=:" %%A in ('ipconfig /all^|find ":"') do (
    set "v=%%~A "
    if "!v:~0,3!" NEQ "   " (
        rem it's a new section
        set /a n+=1
        set "data=!data!&set %~1[!n!].DisplayName=%%A"
    ) ELSE (
        set "v=!v:~3!"
        set "v=!v:.=!"
        set "v=!v: =!"
        set "x=%%~B"
        set "data=!data!&set %~1[!n!].!v!=!x:~1!"
    )
)
set "data=rem.%data:)=^)%"
( ENDLOCAL & REM RETURN VALUES
    %data%
    SET "%~1[#]=%n%"
)
EXIT /b

In %arr[#]% you'll find the number of sections read. Because it doesn't make sense to tell you the names of the other variables (they are language dependent) I used the SET command to display the Name=Value pairs.
If this doesn't work for you try to use the original function (where I replaced the 8s with 3s and 8 blanks with 3 blanks) or count the number of preceding blanks in your output of IPCONFIG /ALL in order to adapt the function by your own.

Steffen


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 5 posts ] 

All times are UTC-06:00


Who is online

Users browsing this forum: No registered users and 14 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited