我有一个奇怪的问题,不确定它是否可能。
我想编写一个脚本,例如我将使用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
这甚至可能吗?
答案 0 :(得分:46)
以下代码适用于自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上找到有关这些命令的详细说明。
答案 1 :(得分:38)
这将在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
要仅打印第一个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
)
)
答案 2 :(得分:16)
在Windows 7中:
for /f "tokens=1-2 delims=:" %%a in ('ipconfig^|find "IPv4"') do set ip=%%b
set ip=%ip:~1%
echo %ip%
pause
答案 3 :(得分:12)
单独提取地址有点困难,但您可以轻松获取整个IP地址行。
要在任何英语Windows操作系统上显示所有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
答案 4 :(得分: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%
答案 5 :(得分:4)
即使你有虚拟网络适配器或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%
答案 6 :(得分:3)
这是@ mousio答案的修改。我的网络连接不是持久的,因此如果ipconfig中缺少字符串“IPv4 Address”,则会显示下一个适配器的IP地址。 ipconfig的结果在适配器之间有2个空格。找到适配器并在“IPv4地址”文本之前出现2个空行后,它会认为它已丢失。仅在Windows 7 64位上测试。
从@ dbenham的回答处理空行: DOS batch FOR loop with FIND.exe is stripping out blank lines?
@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
答案 7 :(得分:2)
我知道这是一篇较旧的帖子,但我试图在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 Address
替换为IP Address
。
答案 8 :(得分:2)
使用IPCONFIG
是好的,除非您希望获得除本地主机之外的远程主机IP的灵活性。要使用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”将始终获取IPv4地址而不是可能的IPv6地址。根据需要省略。另请注意,此技术无法获得多个IP地址。如果这是你的目标,你需要使用NSLOOKUP和一些额外的代码。
请注意,如果您使用NSLOOKUP而不是PING,并且主机有多个IP地址,那么您的变量最后会有一个逗号,因为每个地址都会用逗号分隔。
答案 9 :(得分:1)
假设您提到的Windows操作系统 p config
如果你愿意安装一些Unixy实用程序,比如grep的windows-port和cut,你可以这样做。但是,在像ipconfig这样的情况下,在具有多个NIC或VMWare的机器中会出现问题。
Powershell可能是您想要的工具,请查看here示例。
答案 10 :(得分:1)
Windows中的一行命令以获取IP地址。
for /F "tokens=14" %%i in ('"ipconfig | findstr IPv4"') do SET LOCAL_IP=%%i
此命令后,echo %LOCAL_IP%
将打印IP地址。或者,您可以在批处理脚本中使用%LOCAL_IP%
作为参考变量
答案 11 :(得分:1)
在linux环境中:
ip="$(ifconfig eth0 | grep "inet addr:" | awk '{print $2}' | cut -d ':' -f 2)" | echo $ip
或
ifconfig re0 | grep -v "inet6" | grep -i "inet" | awk '{print $2}'
FreeBSD中的例子:
strings.TrimSpace(cmd[3])
如果您配置了多个IP地址,则stdout中将有多个IP地址。
答案 12 :(得分:0)
下面的脚本会将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
来自this blog post的想法。
答案 13 :(得分:0)
以下内容全部在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}
答案 14 :(得分:0)
您使用ipconfig命令获取IPv4。
帮助链接= for /?
Help = 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%
答案 15 :(得分:0)
在用例中,我无法使用以上任何答案,因此我使用以下命令来获取以太网网络适配器的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
例如,大多数使用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)
在名称列中,您应该找到所需的网络适配器(即以太网,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
(出于安全原因?,我伪造了上述实际IP地址)
我可以在ms-dos命令提示符下使用findstr
命令进一步指定要在哪一行。
在这里,我需要包含字符串IP Address
的行。
netsh interface ip show config name="Ethernet" | findstr "IP Address"
这将提供以下输出:
IP Address: 169.252.27.59
然后,我可以使用for
命令,该命令使我可以分析文件(在这种情况下为多行字符串),并根据分隔符和我感兴趣的项目编号来拆分字符串的内容。
请注意,我正在寻找第三个项目(令牌= 3),并且我使用空格字符和:
作为分隔符(delims=:
)。
for /f "tokens=3 delims=: " %i in ('netsh interface ip show config name^="Ethernet" ^| findstr "IP Address"') do echo Your IP Address is: %i
循环中的每个值或令牌都作为变量%i打印出来,但是我只对第三个“令牌”或项感兴趣(因此tokens=3
)。请注意,我必须使用|
=
和^
在for
命令的末尾,您可以指定要与返回的内容一起运行的命令。在这种情况下,我使用echo
将其与其他一些文本一起打印出来,但是您也可以使用do set IP=%i
将该值分配给一个环境变量,例如,或者根据您的喜好。
很整洁吧?
如果您有任何改进的想法,请发表评论。我很想听听:)或者您也可以编辑。
答案 16 :(得分:0)
对于我的系统,我有许多IPv4地址,其中只有一个是正确的。整理和检查它的简单方法如下:
for /f "tokens=1,2* delims=:" %%A in ('ipconfig ^| find "IPv4 Address"') do (
set "tempip=%%~B"
set "tempip=!tempip: =!"
ping !tempip! -n 1 -w 50
if !errorlevel!==0 (
set localip=!tempip!
goto foundlocal
)
)
:foundlocal
答案 17 :(得分:0)
如果要使用PowerShell或WSL2 bash:
我只是基于this answer on superuser,
但是我发现以下选择更清晰的方式来获取我的LAN IP地址:
找到要了解的接口名称
对我来说是Configuration for interface "Wi-Fi"
,
所以对我来说,名字叫Wi-Fi
。
(用下面的界面名称替换下面命令中的"Wi-Fi"
)
PowerShell:
$myip = netsh interface ip show address "Wi-Fi" `
| where { $_ -match "IP Address"} `
| %{ $_ -replace "^.*IP Address:\W*", ""}
echo $myip
输出:192.168.1.10
或者,以我为例,在WSL2中执行命令:
netsh.exe interface ip show address "Wi-Fi" \
| grep 'IP Address' \
| sed -r 's/^.*IP Address:\W*//'
# e.g.
export REACT_NATIVE_PACKAGER_HOSTNAME=$(netsh.exe interface ip show address "Wi-Fi" \
| grep 'IP Address' \
| sed -r 's/^.*IP Address:\W*//')
答案 18 :(得分:-1)
如果你只是想要ip地址,试试这个:
#Variable to store ip address
ipaddr=$(hostname -I)
echo "$ipaddr"
答案 19 :(得分:-1)
尝试这样的事情
echo "yours ip addresses are:"
ifconfig | grep "inet addr" | cut -d':' -f2 | cut -d' ' -f1
linux like systems