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