1

我的 Windows 批处理文件应该读取文件名并创建一个根据文件名的第 2 到第 5 个字母命名的目录:

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

'string' 的值并没有更新,即在循环的每个步骤中它都是相同的。我怎样才能更新它?

这是 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.
4

2 回答 2

1

您遇到的问题是因为%variable% expansion. 整个FOR语句(包括右括号)是一个语句。当它被读取时,命令处理器用内部执行之前设置的任何字符串%string%替换变量。(实际上,你得到的字符串子集从第二个字符开始,然后是 5 个字符,但这在这里并不重要。我猜你已经设置为“file3”。)SET%string%

无论如何,您可以通过SETLOCAL ENABLEDELAYEDEXPANSION在顶部添加并使用类似语法!string!而不是%string%FOR.

您还可以将处理%string%移到FOR.

查找HELP SETLOCAL更多HELP SET

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

于 2016-09-28T05:37:39.287 回答
0

几乎,您在最后一次尝试中得到了几个不必要的感叹号:

SETLOCAL ENABLEDELAYEDEXPANSION
for %%f in (*.txt) do (
    set string=%%~nf
    if not exist "!string:~2,5!\" mkdir "!string:~2,5!"
)
于 2016-09-28T08:47:11.493 回答