批处理文件读取文件名并创建目录

3
我有一个文件夹里面有一个或多个.txt文件,我想让批处理文件读取它们的文件名,获取从第四个字符开始的20个字符,并在该文件夹中创建一个新目录。这是我的代码:
for /f %%i in ('dir /b *.TXT') do (
    set filename1=%%i
    set folder1=%filename1:~4,20%
    mkdir %folder1%
)

当我运行这个程序时,第一次在第三行(set folder1 = ...)会出现语法错误,并且不会创建任何文件夹。 我尝试第二次运行它,并创建了两个文件夹(一个名为“〜4”,另一个名为“20”)。 第三次运行后,文件夹正确地创建了!如果我关闭命令提示符并再次打开它,则需要运行3次才能创建文件夹。我还尝试使用“for / r . $$ i in(*.TXT)”,但没有成功。据我了解,问题是“set folder1 = ...”所在的行未得到正确的文件名。我还尝试使用%%〜i或%%〜ni,尝试将文件名输出(似乎总是得到正确的字符串)到文本文件中,然后从该文件中读取,同样没有成功。我不知道还有什么别的方法可以尝试。是因为%%i存储文件本身而不是带有文件名的字符串吗?一个示例文件名为“REG_18004247K_20120208_A.TXT”,我想创建一个名为“18004247K_20120208_A”的文件夹。我对批处理编程一点也不熟悉(我只用批处理文件工作了2个星期),我猜问题可能非常简单。 感谢任何帮助。 Kyriacos
2个回答

4
%%i 存储一个文件名的字符串,实际上这是唯一一个按预期工作的“变量”。
关键问题在于你正在循环中使用环境变量替换(filename1folder1),希望它会在每次循环迭代中扩展。
然而,在整个循环开始执行之前,环境变量已经被扩展了。
  1. 因此,在第一批执行时,filename1 未定义,你会得到一个错误,folder1 is not set,你可能还会看到一个名为 %folder1% 的文件夹被创建。
  2. 但是,此时脚本定义了 filename1,第二次执行进一步定义了 folder1(尽管第四行已经使用了错误的值进行了扩展,出现了有趣的事情)。
  3. 第三次执行最终得到了正确的 folder1 值;但显然对于多个文件,这不起作用,因为循环逻辑是失效的。
这个较旧的答案用其他例子和特殊情况解释了这个问题。
你可以通过在脚本开头使用 setlocal enabledelayedexpansion、在循环之前将变量初始化为空字符串,并在扩展它们时切换到 !...! 语法来修复你的批处理脚本:!filename1:~4,20!!folder1!

谢谢你的快速回复,我的朋友!你的答案完美地解决了我的问题。干杯! - Kyris

1
setlocal enabledelayedexpansion
for /r %%i in (*) do (
    set filename1=%%i
    set folder1=!filename1:~4,20!
    mkdir !folder1!
)

由于 ... 延迟扩展需要一些时间来存储实际变量。
!...! 而不是 %...% 可以快速将变量分配给 DOS。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接