要从filename和make目录中读取的批处理文件

时间:2012-07-19 07:25:34

标签: string batch-file dos filenames mkdir

我的目录中有.txt文件(1个或多个),我希望我的批处理文件读取其文件名,从第4个开始获取20个字符并在文件夹中创建新目录。这是我的代码:

for /f %%i in ('dir /b *.TXT') do (
    set filename1=%%i
    set folder1=%filename1:~4,20%
    mkdir %folder1%
)

第一次运行此程序时,第3行(设置folder1 = ....)的语法不正确,并且没有创建文件夹。我尝试第二次运行它并创建了2个文件夹(一个名为“~4”,一个名为“20”)。在第3次运行时,文件夹已正确创建!如果我关闭命令提示符并再次打开它,它还需要在创建文件夹之前运行3次。

我也尝试过使用“for / r。$$ i in(* .TXT)”没有运气。据我所知,问题是带有“set folder1 = ...”的行没有得到正确的文件名。我也尝试过使用%% ~i或%% ~ni,我尝试将文件名(似乎总是得到正确的字符串)输出到文本文件,然后从该文件中读取,同样没有运气。我不知道还有什么可以尝试。是因为%% i存储文件本身而不是文件名的字符串吗?

示例文件名为“REG_18004247K_20120208_A.TXT”,我想要创建一个名为“18004247K_20120208_A”的文件夹。

我对批处理编程一点都不熟悉(我只用了2周的批处理文件),我猜这个问题可能很简单。任何帮助将不胜感激。

Kyriacos

2 个答案:

答案 0 :(得分:4)

%%i会存储带有文件名的字符串。它实际上是唯一能够按预期工作的“变量”。

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

但是,在开始执行整个循环之前,会扩展环境变量。

  1. 因此,在第一次批处理执行时,filename1未定义,您得到 错误folder1 is not set,您可能还会看到一个文件夹 名为%folder1%已创建。
  2. 但是,脚本此时定义filename1,第二次执行进一步正确定义folder1(尽管第4行是 已经使用不正确的值进行了扩展,并且发生了有趣的事情。)
  3. 第三次执行 终于看到了folder1的正确价值;但这显然不会 因为循环逻辑功能失调,所以可以处理多个文件。
  4. This older answer通过其他很多示例和特殊情况解释了这个问题。

    您的批处理可以在脚本开头由setlocal enabledelayedexpansion修复,在循环之前将变量初始化为空字符串,并在展开时切换为!...!语法:!filename1:~4,20! ,和!folder1!

答案 1 :(得分:1)

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

因为...延迟扩展需要一些时间来存储实际变量 !...!而不是%...%回应快速分配变量到DOS。