Windows Batch - 如何将外部 IP 获取到批处理文件变量中

Posted

技术标签:

【中文标题】Windows Batch - 如何将外部 IP 获取到批处理文件变量中【英文标题】:Windows Batch - How to get the external IP into a batch-file variable 【发布时间】:2017-05-30 20:59:51 【问题描述】:

我正在制作一个程序来检查用户的 IP 是否是某个 IP 地址。

目前,我创建了一个成功的内部IP版本:

@echo off
set userIp=192.168.90.100
for /f "tokens=4 delims= " %%i in ('route print ^| find " 0.0.0.0"') do set localIp=%%i
for /f "delims=[] tokens=2" %%a in ('ping %computername% -4 -n 1 ^| findstr "["') do set thisip=%%a
goto :Check

:Check
if %localIp%==%userIp% goto :Good
if %thisip%==%userIp% goto :Good
goto :Bad

我正在尝试制作与外部 IP 相同的东西。

我在网上进行了研究,这是我目前得到的。

@echo off
for /f "tokens=2 delims=:" %%a IN ('nslookup myip.opendns.com. resolver1.opendns.com ^| findstr /IC:"Address"') do if /i %%a=="10.11.12.13" goto :Good
goto :Bad

我需要一些帮助来解决这个问题。

【问题讨论】:

【参考方案1】:

使用纯批处理/已经存在的工具:编辑:更改批处理以正确处理 IPv6 地址

@Echo off
for /f "tokens=1* delims=: " %%A in (
  'nslookup myip.opendns.com. resolver1.opendns.com 2^>NUL^|find "Address:"'
) Do set ExtIP=%%B
Echo External IP is : %ExtIP%

Reference

另一个带powershell的:

@Echo off
For /f %%A in (
  'powershell -command "(Invoke-Webrequest "http://api.ipify.org").content"'
) Do Set ExtIP=%%A
Echo External IP is : %ExtIP%

还有另一个稍微不同的 powershell 变体:

@Echo off
For /f %%A in (
  'powershell -nop -c "(Invoke-RestMethod http://ipinfo.io/json).IP"'
) Do Set ExtIP=%%A
Echo External IP is : %ExtIP%

【讨论】:

猜猜我必须在 Windows 7 上将我的 powershell 版本更新到版本 3。 在获取 IPv6 地址时是否可以(以及如何)检索 IPv4 地址? @script'n'code 该主题是关于 external IP 地址的,因此如果您有 IPv4 或 IPv6 地址(或两者都像我一样 ATM),则取决于您的 Internet 连接) 上面的第一批在第一个冒号之后没有很好地处理 IPv6 地址。 已更改如果两个 IPv4/6 都存在,第 1 批将显示 IPv6,而第 2 批将显示 IPv4。【参考方案2】:

要在不进行额外解析的情况下获取您的公共 IP,请执行以下操作:

卷曲“http://api.ipify.org”

编辑:

此版本跨 windows 语言版本更可靠:

for /f "tokens=3 delims== " %%A in ('
nslookup -debug myip.opendns.com. resolver1.opendns.com 2^>NUL^|findstr /C:"internet address"
') do set "ext_ip=%%A"

【讨论】:

我正在运行 Windows 10,它说:“'curl' 不被识别为内部或外部命令、可运行程序或批处理文件。”我希望它能够在大多数 Windows 版本上工作包括我自己的。 Curl 现在是 WIndows 10 的一部分 为了兼容 Windows 7,您需要使用 nslookup。【参考方案3】:

第一个.com之后似乎有一个.太多了。

第二次使用简单的google.comecho %a 命令时,我得到以下信息:

" xx.xx.xx.x" 没有引号和两个前导空格!

所以你的假设永远不会是真的!

把它改成这样:if "%%a"==" xx.xx.xx.x" Goto:good 你应该没问题。

【讨论】:

你能用它应该是的代码编辑你的答案吗?我不知道您对 google.com 的简单理解是什么意思,因为当我运行它时它会给我一个错误。另外,这适用于所有 Windows 版本吗? 我也必须自己进行测试,然后运行nslookup google.com 来检查我得到的输出。除了如上所述的 if 条件外,您无需更改任何内容。只要nslookup 存在,这应该适用于所有Windows 版本。因为我现在很忙,所以稍后会出现代码。

以上是关于Windows Batch - 如何将外部 IP 获取到批处理文件变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何批量验证字符串是有效的 IPv4 或 IPv6 地址?

Windows BATCH:如何禁用单个脚本的快速编辑模式?

Windows Batch:如何添加主机条目?

如何将一个域名指向虚拟机Windows2003中的新云网站管理系统,并怎样从外部进行登录?请高手赐教。非常感谢

需要帮助让bash / batch在Windows 10上为R工作

Spring Batch - 有没有办法异步执行 TaskletStep?