从文件名和生成目录中读取批处理文件



我在一个目录中有.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确实存储了一个带有文件名的字符串。事实上,它是这里唯一一个按预期工作的"变量"。

关键问题是在循环中使用环境变量替换(filename1folder1),希望它在循环的每次迭代中都能扩展。

然而,在整个循环开始执行之前,环境变量会被展开。

  1. 因此,在第一次批处理执行时,没有定义filename1出现错误folder1 is not set,您可能还会看到一个文件夹称为创建的CCD_ 6
  2. 然而,脚本此时定义了filename1,第二次执行将进一步正确定义folder1(尽管第4行已经使用不正确的值进行了扩展,并且很有趣)
  3. 第三次执行最后得到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_。

最新更新