批处理FOR循环delims不行为

时间:2014-05-12 02:37:28

标签: batch-file for-loop delimiter

我试图在FOR循环中使用REG QUERY返回程序的安装位置。我的命令如下:

FOR /F "TOKENS=2 DELIMS=REG_SZ" %%a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2^>NUL') DO SET TSLOC=%%a

现在,REG QUERY自己回归:

    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

但是使用分隔符REG_SZ返回:

C:\Users\Jake\Desktop>FOR /F "TOKENS=2 DELIMS=REG_SZ" %a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2>NUL') DO SET TSLOC=%a
C:\Users\Jake\Desktop>SET TSLOC=Y
C:\Users\Jake\Desktop>SET TSLOC=    C:\Program Files (x86)\Team

所以显然我最终只能到达\团队。我不知道它从哪里获得“Y”或为什么delim导致它在\ Team分裂。如果我将令牌#更改为3,则返回:

peak 3 Client

所以不知何故,它必须将“s”解释为我的分隔符,对吗?

我的问题是为什么(或者如果没有,它在做什么?)我怎样才能让它给我整个事情。我做错了什么?

3 个答案:

答案 0 :(得分:1)

DELIMS是一组字符,而不是单个字符串。因此,REG_SZ中的任何字符都将充当分隔符。

答案 1 :(得分:1)

如果REG QUERY返回下面的字符串(包含空格):

    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

...然后你希望在第二个之后用空格分隔的标记(即默认的标记分隔符),即:

FOR /F "TOKENS=2*" %%a IN ('REG QUERY "HKLM\SOFTWARE\Wow6432Node\TeamSpeak 3 Client" /V "" 2^>NUL') DO SET TSLOC=%%b

答案 2 :(得分:1)

SET "tsloc=    (Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client"
SET "tsloc=%tsloc:*REG_SZ    =%"
ECHO +%tsloc%+

由于REG QUERY自行返回:

(Default)    REG_SZ    C:\Program Files\TeamSpeak 3 Client

上述SET命令将删除不需要的数据。结果显示在+之间,以证明没有空格。

公式:set var =%somevar:* string1 = string2%

会将var的值分配给somevar,所有字符最多string1替换为string2set命令中的封闭引号可确保该行上的任何杂散尾随空格包含在分配的值中。