2016-09-28 101 views
1

我的Windows批处理文件应该读取文件名,并创建一个根据文件名的第2至5字母命名的目录:通过在Windows中使用组字符串值循环在cmd

for %%f in (.\*.txt) do (
set string=%%~nf 
mkdir %string:~2,5%  
) 

“字符串的值'虽然没有更新,即它在循环的每一步中都是相同的。我怎样才能更新它?

这是CMD输出:

>for %f in (.\*.txt) do (
set string=%~nf 
mkdir le3 
) 

>(
set string=file1 
mkdir le3 
) 

>(
set string=file2 
mkdir le3 
) 
A subdirectory or file le3 already exists. 

>(
set string=file3 
mkdir le3 
) 
A subdirectory or file le3 already exists. 
+0

尝试在SO约'delayedexpansion'咨询数百篇文章。实质上,当代码块被解析时,代码块中的'%var%'被替换为'var'的值。要访问块内的变化值,首先要使用'setlocal enabledelayedexpansion'命令调用'delayedexpansion',然后使用'!var!'访问变量的动态值。 – Magoo

+0

谢谢你的回复。我咨询过几个网站,例如(链接)(http://stackoverflow.com/questions/6679907/how-do-setlocal-and-enabledelayedexpansion-work)并提出了'SETLOCAL ENABLEDELAYEDEXPANSION for %% f in(。\ *。txt)do(set !string!= %%〜nf mkdir!string:〜2,5!)' - 但延迟扩展似乎还没有工作。你有什么建议吗? – Joan

+0

'set!string!= %%〜nf'应该是'set string = %%〜nf' - 您打算设置变量'string',而不是变量'string的当前内容' – Magoo

回答

1

你正在运行到的问题是因为%variable% expansion。整个FOR声明(包括直到右括号)是一个声明。当它被读取时,命令处理器用字符串设置为替换%string%变量里面的SET执行。 (实际上,你得到的开始的第2个字符,并继续进行5个字符的子集,但在这里,这不是真的很重要。我的猜测是,你有%string%设置为“文件3”)。

无论如何,您可以通过在顶部添加SETLOCAL ENABLEDELAYEDEXPANSION并在FOR内使用像!string!而不是%string%这样的语法来解决此问题。

您还可以将%string%的处理移动到FOR之外。

查看HELP SETLOCALHELP SET了解更多。另外,如果你没有注意到,你没有得到文件名的第二个和第五个字符......正如我所提到的,你得到了一个长度为5的子字符串,从字符开始2.查看更多HELP SET

+0

我现在启用了延迟扩展和适应代码: 'SETLOCAL ENABLEDELAYEDEXPANSION 为%% F IN做( 组字符串= %%〜NF 的mkdir串!!!〜2,5 \t \t )(\ * TXT。)' 我理解这个想法,也尝试在不同的地方设置引号,但是我仍然没有得到延迟的扩展 - 任何想法? – Joan

0

近,你有一对夫妇不必要的感叹号在最后一次尝试:

SETLOCAL ENABLEDELAYEDEXPANSION 
for %%f in (*.txt) do (
    set string=%%~nf 
    if not exist "!string:~2,5!\" mkdir "!string:~2,5!" 
) 
+0

非常感谢!这解决了这个问题! – Joan

+0

如果您相应地标记了正确的答案,我会帮助网站和检举响应方。 – Compo