如何将IP地址转换为批处理文件变量?

lev*_*l42 46 ip batch-file

我有一个奇怪的问题,不确定它是否可行.

我想写一个脚本,例如我将使用ipconfig作为我的命令.

现在,当你正常运行这个命令时,输出量很大.

我想要的是一个只显示IP地址的脚本.

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

输出将是

Network Connection Test

Your IP Address is: 192.168.1.1
Run Code Online (Sandbox Code Playgroud)

这甚至可能吗?

Fab*_*tti 50

以下代码适用于自Windows XP以来任何平台的任何区域设置,它从您的网卡(或多或少)随机查找网络IP.它永远不会超过几毫秒.

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

下面的代码将查找您的公共IP,并适用于Windows 7和更新的计算机.

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

您可以在我的博客上找到这些命令的详细说明.

  • 它给了我一个错误:"%% a此时出乎意料." (3认同)
  • 这仅用于批处理,您可能正在命令行中运行它,对吗? (2认同)
  • 如果您没有第二个本地接口,这很好。对我来说,它从以太网适配器 VirtualBox Host-Only Network #2 选择 IP。当你禁用它时,就没事了。 (2认同)

mou*_*sio 40

这将在以下输出中打印IP地址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
Run Code Online (Sandbox Code Playgroud)

要仅打印第一个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
)
Run Code Online (Sandbox Code Playgroud)

一种更可配置的方法是实际解析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
    )
)
Run Code Online (Sandbox Code Playgroud)

  • 在我的Win7计算机上,匹配的东西字符串是"IPv4地址". (3认同)
  • 我认为您需要将"IP地址"更改为"IP地址",或将`/ I`传递给`findstr`以进行不区分大小写的匹配. (2认同)

小智 17

在Windows 7中:

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


ind*_*div 13

单独提取地址有点困难,但您可以轻松获得整个IP地址行.

要在任何英语Windows操作系统上显示所有IP地址:

ipconfig | findstr /R /C:"IP.* Address"
Run Code Online (Sandbox Code Playgroud)

要在Windows 7+上仅显示IPv4或IPv6地址:

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

ipconfig | findstr /R /C:"IPv6 Address"
Run Code Online (Sandbox Code Playgroud)

以下是带有3个网络适配器的XP机器的一些示例输出.

        IP Address. . . . . . . . . . . . : 192.168.1.10
        IP Address. . . . . . . . . . . . : 10.6.102.205
        IP Address. . . . . . . . . . . . : 192.168.56.1
Run Code Online (Sandbox Code Playgroud)


小智 12

@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%
Run Code Online (Sandbox Code Playgroud)

  • 如果您有多个适配器(例如 VirtualBox、VMWare),这是最佳解决方案 (3认同)

Jos*_*yck 7

tldr;

我无法在我的用例中使用上述任何答案,所以我使用以下命令来获取我的以太网网络适配器的 ip 地址,并如上述问题中所述回显它。

在命令行中:

for /f "tokens=3 delims=: " %i  in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do echo Your IP Address is: %i
Run Code Online (Sandbox Code Playgroud)

或者在批处理文件中:

for /f "tokens=3 delims=: " %%i  in ('netsh interface ip show config name^="Wi-Fi" ^| findstr "IP Address" ^| findstr [0-9]') do set IP=%%i
Run Code Online (Sandbox Code Playgroud)

对于那些想知道这一切意味着什么的人,请继续阅读

ipconfig例如,使用的大多数命令只是打印出您所有的 IP 地址,而我需要一个特定的地址,在我的情况下是用于我的以太网网络适配器。

您可以使用该netsh interface ipv4 show interfaces命令查看网络适配器列表。大多数人需要 Wi-Fi 或以太网。

您将在命令提示符的输出中看到这样的表:

Idx     Met         MTU          State                Name
---  ----------  ----------  ------------  ---------------------------
  1          75  4294967295  connected     Loopback Pseudo-Interface 1
 15          25        1500  connected     Ethernet
 17        5000        1500  connected     vEthernet (Default Switch)
 32          15        1500  connected     vEthernet (DockerNAT)
Run Code Online (Sandbox Code Playgroud)

在名称列中,您应该找到所需的网络适配器(即以太网、Wi-Fi 等)。

如前所述,我对Ethernet我的案例很感兴趣。

要获取该适配器的 IP,我们可以使用 netsh 命令:

netsh interface ip show config name="Ethernet"

这给了我们这个输出:

Configuration for interface "Ethernet"
    DHCP enabled:                         Yes
    IP Address:                           169.252.27.59
    Subnet Prefix:                        169.252.0.0/16 (mask 255.255.0.0)
    InterfaceMetric:                      25
    DNS servers configured through DHCP:  None
    Register with which suffix:           Primary only
    WINS servers configured through DHCP: None
Run Code Online (Sandbox Code Playgroud)

(出于安全原因,我伪造了上面的实际 IP 号码)

我可以使用findstrms-dos 命令提示符中的命令进一步指定我想要的行。这里我想要包含字符串的行IP Address

netsh interface ip show config name="Ethernet" | findstr "IP Address"
Run Code Online (Sandbox Code Playgroud)

这给出了以下输出:

netsh interface ip show config name="Ethernet" | findstr "IP Address"
Run Code Online (Sandbox Code Playgroud)

然后,我可以使用for允许我解析文件(或本例中的多行字符串)的命令,并根据分隔符和我感兴趣的项目编号拆分字符串的内容。

请注意,我正在寻找第三个项目 (tokens=3),并且我正在使用空格字符:作为我的分隔符 ( delims=: )。

 IP Address:                           169.252.27.59
Run Code Online (Sandbox Code Playgroud)

循环中的每个值或标记都作为变量 %i 打印出来,但我只对第三个“标记”或项目感兴趣(因此tokens=3)。请注意,我必须逃脱|=使用^

for命令的末尾,您可以指定要使用返回的内容运行的命令。在这种情况下,我使用echo其他一些文本将其打印出来,但您也可以将值分配给环境变量,do set IP=%i例如或您喜欢的任何内容。

很整洁吧?

如果您有任何改进的想法,请发表评论。我很想听听:) 或者你可以编辑。


Ser*_*eyA 6

即使您有虚拟网络适配器或 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%
Run Code Online (Sandbox Code Playgroud)