string - 从文件名和创建目录中读取的批处理文件

标签 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 行语法不正确的错误 (setfolder1=....),并且没有创建文件夹。我尝试第二次运行它,并创建了 2 个文件夹(一个名为“~4”,一个名为“20”)。第三次运行时,文件夹已正确创建!如果我关闭命令提示符并再次打开它,它还需要运行 3 次才能创建文件夹。

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

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

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

基里亚科斯

最佳答案

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

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

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

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

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

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

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

相关文章:

html - Bash 字符串格式化

python - 从文本文件中解析项目

for-loop - 如何使用 ! 处理路径名在 for/F 循环中?

time - 如何在 DOS 中对脚本进行计时?

c++ - 每次我为我的 C++ 程序提供大量输入集时,我的 DOS 都会崩溃

C - 如果长度不同,则将 2 个字符串中的数字加在一起

Java:Windows 上的 Runtime.exec() 和 Unicode 符号:如何使其能够处理非英文字母?

batch-file - 使用 Windows ren 命令删除 !从文件名

batch-file - 交互式批处理文件

mysql - Bash mysql数组没有得到空值