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