看看 - 为什么令牌= *永远不适合我?

时间:2017-01-02 17:43:40

标签: loops batch-file for-loop

例如,我想用\作为我的分隔符来解析这样的单行:

c:\some directory\another directory\filename.ext

所以我设置了一个变量:

set mydir=c:\some directory\another directory\filename.ext

每次运行我的脚本时,这个目录都会改变,所以我可能不知道我的字符串中会有多少个令牌,但最终我想要收集整个sting,减去最后一个令牌。问题是,当我甚至尝试使用所有令牌测试解析时,我永远无法让它返回我期望的结果。

当我使用

For /F "delims=\ tokens=1-2" %a in ("%mydir%") do echo %a %b

我得到了

c: some directory

但是当我使用

For /F "delims=\ tokens=*" %a in ("%mydir%") do echo %a %b

我得到了

c:\some directory\another directory\filename.ext b%

为什么会这样?当我使用tokens=*时,似乎忽略了我的分隔符。

我希望它能显示

c: some directory

1 个答案:

答案 0 :(得分:2)

For %%a in ("%mydir%") do echo %%~dpa

应该按照您声称的要求显示“整个刺痛,减去最后一个令牌”(但我在批处理文件中将%所需的metavariables加倍,而不是直接从提示)

tokens=*对你没有“正常工作”的原因(即做你期望它做的事情)是令牌*表示remainder of the string, past the last tokend number specified。您尚未指定任何标记,因此字符串的“余数”是整个字符串。

如果您需要c some directory,那么您选择的是第一个和第二个令牌,因此您使用tokens=1,2,*将第一个令牌分配给%%a,第二个令牌分配给%%b }和字符串的其余部分到%%c。请注意,2*之间的逗号是可选的(并且还允许1-2*)。

在这种情况下,c:将分配给%%asome directory分配给%%b,其余部分分配给%%c