3

我在一个目录中有 .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 次运行时,该文件夹已正确创建!如果我关闭命令提示符并再次打开它,它还需要运行 3 次才能创建文件夹。

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

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

我完全不熟悉批处理编程(我只使用批处理文件大约 2 周),我猜这个问题可能非常简单。任何帮助,将不胜感激。

基里亚科斯

4

2 回答 2

4

%%i确实存储了一个带有文件名的字符串。它实际上是这里唯一可以按预期工作的“变量”。

关键问题是您在循环中使用环境变量替换(offilename1和 of folder1),希望它在循环的每次迭代中都会被扩展。

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

  1. 因此,在第一批执行时,filename1未定义,您会收到错误,folder1 is not set并且您可能还会看到一个名为%folder1%created 的文件夹。
  2. 但是,此时脚本已定义filename1,并且第二次执行进一步folder1正确定义(尽管第 4 行已经使用不正确的值进行了扩展并且发生了乐趣)。
  3. 第三次执行终于看到了正确的值folder1; 但这显然不适用于一个以上的文件,因为循环逻辑功能失调。

这个较旧的答案用其他很好的例子和特殊情况解释了这个问题。

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

于 2012-07-19T08:02:13.040 回答
1
setlocal enabledelayedexpansion
for /r %%i in (*) do (
    set filename1=%%i
    set folder1=!filename1:~4,20!
    mkdir !folder1!
)

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

于 2012-09-20T11:06:56.313 回答