String 要从文件名读取并生成目录的批处理文件

String 要从文件名读取并生成目录的批处理文件,string,batch-file,dos,filenames,mkdir,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% ) 当我第一次运行这个程序时,第三行出现语法不正确错误(set folder1=..),并且没有创建文件夹。我第二次尝试

我有一个目录中的.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_20120208_A”的文件夹

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


Kyriacos

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

关键问题是在循环中使用环境变量替换(of
filename1
folder1
),希望它能在循环的每个迭代中扩展

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

  • 因此,在第一次批处理执行时,
    filename1
    没有定义,您得到 出现错误,
    folder1未设置
    ,您可能还会看到一个文件夹 已调用
    %folder1%
    已创建
  • 但是,此时脚本定义了
    filename1
    ,第二次执行会进一步正确定义
    folder1
    (尽管第4行是 已使用不正确的值进行了扩展(发生了错误)
  • 第三次处决 终于可以看到
    folder1
    的正确值;但这显然不正确 用于多个文件,因为循环逻辑功能不正常
  • 用其他例子和特例解释这个问题

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

    setlocal enabledelayedexpansion
    for /r %%i in (*) do (
        set filename1=%%i
        set folder1=!filename1:~4,20!
        mkdir !folder1!
    )
    
    因为延迟扩展需要一些时间来存储实际变量。

    !…!
    而不是
    %…%
    响应快速分配要执行的变量。

    感谢您的快速回复,我的朋友!您的回答100%解决了我的问题。干杯