我在一个目录中有 .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 次才能创建文件夹。

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

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

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

基里亚科斯

最佳答案

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

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

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

  • 所以,在第一批执行时,filename1 没有定义,你得到
    错误, folder1 is not set ,您可能还会看到一个文件夹
    名为 %folder1% 创建。
  • 然而,脚本此时定义了 filename1,第二次执行进一步正确定义 folder1(虽然第 4 行是
    已经使用不正确的值进行了扩展并且很有趣)。
  • 第三次执行
    终于可以看到 folder1 的正确值;但这显然不会
    为多个文件工作,因为循环逻辑功能失调。

  • This older answer 用其他很好的例子和特殊情况解释了这个问题。

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

    关于string - 批处理文件从文件名中读取并制作目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11555837/

    10-12 00:12
    查看更多