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

问题描述:

我有一个目录中的.txt文件(1或更多),我希望我的批处理文件读取它们的文件名,从第4个开始获得20个字符,并在夹。这里是我的代码:批处理文件从文件名和目录中读取

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

当我运行这个程序的第一时间,我得到一个语法行第三行不正确的错误(组文件夹1 = ....),并没有文件夹中创建。我试着第二次运行它,创建了2个文件夹(一个名为“〜4”,另一个名为“20”)。在第三次运行时,该文件夹已正确创建!如果关闭命令提示符并再次打开它,则它在创建文件夹之前还需要运行3次。我已经尝试使用“for/r。$$我在(* .TXT)没有运气。据我所知,问题是,具有”set folder1 = ...“的行不会得到我也尝试使用%%〜i或%%〜ni,我试着输出文件名(它似乎总是得到正确的字符串)到一个文本文件,然后从该文件读取,再次这是因为%%我存储文件本身,而不是一个字符串与文件名?

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

我对批处理编程(I只能用批处理文件工作2周),我猜这个问题可能非常简单。任何帮助,将不胜感激。

Kyriacos

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

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

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

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

This older answer用其他很多例子和特例解释了这个问题。

你的料可以通过setlocal enabledelayedexpansion在脚本的开头是固定的,在循环之前初始化变量为空字符串,并扩大他们的时候切换到!...!语法:!filename1:~4,20!,和!folder1!

+0

感谢您的快速回复我的朋友!你的答案100%解决了我的问题。干杯 – Kyris 2012-07-19 08:44:24

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

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