我如何通过管道传输到 for 命令。因此,
C:\asd>ipconfig | findstr "Address" >a
C:\asd>for /f "tokens=15" %f in (a) do @echo %f
192.168.1.3
我希望能够在一行中完成这一切。
C:\asd>ipconfig | findstr "Address" | for /f "tokens=15" %f do @echo %f
do was unexpected at this time.
答案1
虽然似乎没有文档说明,但您可以通过管道将命令传递到 FOR 命令中。我第一次了解到它来自这个例子:
SC query | FOR /F "tokens=2" %%i IN ('FIND /I "SERVICE_NAME"') DO @ECHO %%i
您的代码的修改版本有效:
C:\>ipconfig | for /f "tokens=14" %f in ('findstr "Address"') do @echo %f
192.168.x.x
192.168.y.y
您还可以在 FOR 命令中使用“more”,如下所述这个答案,解析来自任意命令的管道输入:
C:\>ipconfig | findstr "Address" | for /f "tokens=14" %f in ('more') do @echo %f
192.168.x.x
192.168.y.y
答案2
查看文档for
(运行for /?
查看),我认为for /f
不会从管道读取。唯一有效的来源是文件集、“字符串”和“命令”。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
你可以将命令放入如下for
内容中:
for /f "tokens=15" %f in ('ipconfig ^| findstr "Address"') do @echo %f
192.168.x.x
192.168.y.y
(感谢神经松解术指出这必须是^|
,而不仅仅是|
)
或者您可以尝试放入ipconfig | findstr "Address"
单独的批处理脚本并调用:
for /f "tokens=14" %f in ('ipaddresses') do @echo %f
(假设你调用了该脚本ipaddresses
)。
或者你也可以使用它for
来完成工作findstr
,如下所示:
for /f "tokens=2,14" %i in ('ipconfig') do @if %i==Address. @echo %j
192.168.x.x
192.168.y.y
它不太一样,因为它不匹配 IPv6 地址,但是类似的东西可以起作用。
还请注意,我将其更改tokens=15
为tokens=14
。我认为该行上的最后一个字段是标记 14。无论如何对我来说都有效。