使用批处理文件将本地IP地址写入文本文件

8

我希望创建一个批处理文件,将本地IP地址写入txt文件。当我运行以下代码(文件路径错误但不是问题)的批处理文件时:

ipconfig | find "IP Address" > \File.txt

我获取了整个Windows IP配置(我用xxx更改了一些数字和其他内容以不显示所有信息)。
    IP Address. . . . . . . . . . . . : 100.100.100.223

    IP Address. . . . . . . . . . . . : 192.xxx.xxx.xxx

我希望将内容仅写入文件100.100.100.223

我对批处理文件不太熟悉,虽然我搜寻了很多资料,但仍感到困惑(可能是搜索词不准确)。

顺便提一下,我使用的是Windows XP操作系统(因为有些答案在XP上无法实现)。

4个回答

8
for /f "tokens=2 delims=:" %%a in ('ipconfig^|find "IPv4 Address"') do (
set ip=%%a
goto :BREAK
)

:BREAK
echo %ip: =% >ip.txt

1
这非常有帮助!比那个被标为“正确”的答案还要好! - GavinWoods
这个是正确的,不是标记的那个。 - undefined

7

使用 SET /P 命令将刚写入的文件的第一行读入变量中,然后使用 ECHO 命令覆盖该文件:

ipconfig | find "IP Address" > \File.txt
< \File.txt SET /P first_ip=
ECHO %first_ip%> \File.txt

更新(回答评论):

要仅提取IP地址,您可以使用类似于以下方式的FOR /F循环:

ipconfig | find "IP Address" > \File.txt
< \File.txt SET /P first_ip=
FOR /F "delims=: tokens=2" %%I IN ("%first_ip%") DO (
  ECHO %%I> \File.txt
)

一个 FOR /F 循环允许您逐行处理文本(文件或字符串),根据指定的分隔符将每行分割为字段(或 标记)。您可以在内置帮助 (FOR /?) 中了解更多关于此命令的信息。我只想补充说,在这种情况下,处理的部分是一个字符串(first_ip 的值),分隔符设置为 :,循环变量 (%% I) 接收第二个标记,即 IP 地址。

请注意,: 和 IP 之间的空格被保留,即它成为标记的一部分 ( 100.100.100.223),因此也会写入文件。如果您对此不太满意,可以使用子程序来去掉空格,例如:

ipconfig | find "IP Address" > \File.txt
< \File.txt SET /P first_ip=
FOR /F "delims=: tokens=2" %%I IN ("%first_ip%") DO (
  CALL :MyEcho %%I
)
:: the following command is there merely to
:: avoid running (into) the subroutine again
GOTO :EOF

:MyEcho
ECHO %1> \File.txt

当子程序被调用时(CALL :MyEcho %%I),参数会带有前置空格一起传递。但是在处理子程序的命令行时,该空格不再被视为值的一部分,因为参数没有被引用,所以解析器只会看到一个用两个空格分隔的参数与名称。因此,子程序中的%1将计算为不带前导空格的地址。

还有一件事,我可以打印出 " IP地址. . . . . . . . . . . . : 100.100.100.223",我能否以某种方式将其更改为仅显示 "100.100.100.223"? - Kondax

1

如果你熟悉PowerShell,可以尝试这个:

powershell.exe -c "gwmi Win32_NetworkAdapterConfiguration | ? { $_.IPAddress -ne $null } | % {$_.ipaddress[0]}"

我有点困惑(我通常是新手),我会再检查一下,看看我能得到什么!非常感谢。 - Kondax
1
当然,你需要将输出重定向到File.txt。这在我的代码中没有添加。 - anishsane
当使用PowerShell时,为什么还要进行可怕的解析?只需使用:Get-NetIPAddress | % { $_.IPAddress } - cel sharp
在Win7上出现“Get-NetIPAddress”不被识别为cmdlet、函数、脚本文件或可操作程序的名称。但是,有更好的选择可用。我很久以前就添加了这个答案,当时我并不知道有其他替代方案……正在更新答案。 - anishsane

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接