我感觉我在用 FOR 循环选项兜圈子。
我试图获取一个字符串(命令的输出)并用逗号分隔它,然后使用每个值来设置,例如
字符串:
USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
所以我想用逗号分割,然后在 SET 中使用该变量。 提前不知道会有多少变数
我尝试过以下方法:
FOR %%L IN (%MYSTRING%) DO ECHO %%L
但是等号也分裂了所以我最终得到
USER
Andy
IP
1.2.3.4
等等
我只想能够执行以下操作,以便我可以
SET USER=Andy
等,例如:
FOR %%L IN (%MYSTRING%) DO SET %%L
我缺少什么选项或标志?
普通
FOR
命令(无 /F
选项)中元素的默认分隔符是空格、制表符、逗号、分号和等号,并且无法修改,因此可以使用 FOR /F
命令来解决这个问题是这样的:
@echo off
set MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
:nextVar
for /F "tokens=1* delims=," %%a in ("%MYSTRING%") do (
set %%a
set MYSTRING=%%b
)
if defined MYSTRING goto nextVar
echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%
解决此问题的另一种方法是首先获取变量名称,然后在常规 FOR 命令中对每对值执行赋值:
setlocal EnableDelayedExpansion
set MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
set varName=
for %%a in (%MYSTRING%) do (
if not defined varName (
set varName=%%a
) else (
set !varName!=%%a
set varName=
)
)
echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%
编辑2023/01/20:添加新方法
我知道这是一个非常古老的问题。然而,我无法抗拒诱惑,发布一个新的非常有趣的方法来解决这个老问题:
@echo off
set MYSTRING=USER=Andy,IP=1.2.3.4,HOSTNAME=foobar,PORT=1234
set "%MYSTRING:,=" & set "%"
echo USER=%USER%, IP=%IP%, HOSTNAME=%HOSTNAME%, PORT=%PORT%
如果您想知道神奇之处,请删除
@echo off
行,执行程序并仔细查看屏幕...
如果您的输入类似于 HOSTNAME:PORT 并且您需要拆分为单独的变量,那么您可以使用它
@echo off
set SERVER_HOST_PORT=10.0.2.15:8080
set SERVER_HOST_PORT=%SERVER_HOST_PORT::=,%
for /F "tokens=1* delims=," %%a in ("%SERVER_HOST_PORT%") do (
set SERVER_HOST=%%a
set SERVER_PORT=%%b
)
echo SERVER_HOST=%SERVER_HOST%
echo SERVER_PORT=%SERVER_PORT%
不知道是否有人对此感兴趣,但我找不到任何有关如何在任何地方执行此操作的信息,所以...我正在努力解决如何在子例程中执行类似的操作并使所有设置的变量可用于范围子例程是从哪里调用的。但是,如果您尝试在 for 循环中使用
endlocal & set
,那么在第一次迭代后,所有内容都会变得很糟糕。
解决方案是为每个循环迭代创建一个前缀为
& set "A=B"
的字符串。在循环开始之前从空字符串开始,并将 A 和 B 更改为在循环迭代的分隔字符串中找到的任何变量名和值。但请记住转义双引号,否则可能会发生奇怪的情况。
然后,在 for 循环完成后,您应该得到一个像这样的字符串
&set "A=B"&set "C=D"&set "E=F"
存储在某个变量中。然后只需运行 endlocal %returnstring%
,它应该扩展为 setlocal &set "A=B"&set "C=D"&set "E=F"
然后 exit /b
,所有这些变量应该在子例程完成后可用。
这就是我的代码在 for 循环中的样子(
set "return="
在循环之前完成):
set "return=!return!&set ^"!name!=!value!^""
循环之后,子程序的最后几行:
endlocal %return%
exit /b
注意 setlocal 和 %return% 之间没有 & ,因为字符串前面有一个 & 。另外,由于延迟扩展的工作原理,我认为
endlocal !return!
不会起作用。