我在一个目录中有 .txt 文件(1 个或多个),我希望我的批处理文件读取它们的文件名,从第 4 个字符开始获取 20 个字符并在文件夹中创建一个新目录。这是我的代码:
for /f %%i in ('dir /b *.TXT') do (
set filename1=%%i
set folder1=%filename1:~4,20%
mkdir %folder1%
)
当我第一次运行这个程序时,我收到第 3 行的语法不正确错误(set folder1=....),并且没有创建文件夹。我尝试第二次运行它,并创建了 2 个文件夹(一个名为“~4”,一个名为“20”)。在第三次运行时,文件夹已正确创建!如果我关闭命令提示符并再次打开它,它还需要运行 3 次才能创建文件夹。
我也试过使用 "for/r . $$i in (*.TXT) 没有运气。据我所知,问题是带有 "set folder1=..."的行没有得到正确的文件名。我也试过使用 %%~i 或 %%~ni,我试过将文件名(似乎总是得到正确的字符串)输出到文本文件,然后从该文件中读取,再次没有运气。我不知道还能尝试什么。是因为 %%i 存储的是文件本身而不是带有文件名的字符串吗?
示例文件名为“REG_18004247K_20120208_A.TXT”,我想创建一个名为“18004247K_20120208_A”的文件夹。
我对批处理编程一点也不熟悉(我只使用批处理文件大约 2 周),我猜这个问题可能很简单。任何帮助,将不胜感激。
基里亚科斯
最佳答案
%%i
确实存储了一个带有文件名的字符串。它实际上是唯一在这里按预期工作的“变量”。
关键问题是您在循环内使用环境变量替换(filename1
和 folder1
),希望它会在循环的每次迭代中扩展。
但是,在整个循环开始执行之前,环境变量会被扩展。
filename1
没有定义,你得到错误,
folder1 is not set
,您可能还会看到一个文件夹名为
%folder1%
创建。 filename1
,第二次执行进一步正确定义 folder1
(虽然第 4 行是已经使用不正确的值进行了扩展并且很有趣)。
终于可以看到
folder1
的正确值;但这显然不会为多个文件工作,因为循环逻辑功能失调。
This older answer 用其他很好的例子和特殊情况解释了这个问题。
您的批处理可以通过脚本开头的
setlocal enabledelayedexpansion
修复,在循环之前将变量初始化为空字符串,并在扩展它们时切换到 !...!
语法: !filename1:~4,20!
和 !folder1!
。关于string - 批处理文件从文件名中读取并制作目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11555837/