【问题标题】:Batch File Loop批处理文件循环
【发布时间】:2022-10-21 20:40:41
【问题描述】:

我需要在单个目录中的多个子文件夹中迁移一堆文件。每个子文件夹最多包含 100 个数据文件(0000-0099,0100-0199 等),分别命名为 dir_001、dir_002 等。

例如我可以成功转移全部以“F_0”为前缀的文件使用以下命令:

for /r X:\<PATH1>\ %%F in (F_0*.txt) do copy %%F E:\<PATH2>\

这将抓住全部文件来自全部涵盖从 F_00001.txt 到 F_09999.txt(或任何上限)的所有图像的子文件夹。但大多数时候我只需要一个较小的子集,例如从 F_04395.txt 到 F04542.txt。

这是我一直在尝试的不是工作

for /r X:\PATH1\ %%F in (F_0*.txt) do (
    For %%A in (%%F) do (
    Set Folder=%%~dpA
    For /L %%i in (4395 1 4542)do if /I exist Folder\F_0%%i.txt copy %%F E:\PATH2\
    )
)

在将文件路径转换为变量时,这似乎中断了。

它还需要适用于从 F_000001.txt 到 F_010001.txt 的序列,或者换句话说,从文件号 1 到 1001 的序列(0-9、10-99,100-999,1000-9999 的前导零数量不同,所以它总是一个 5 位数字加上前缀“F_0”)

任何建议将不胜感激!

更新: 感谢@Gerhard,我已将代码更改为下面的代码,但仍然无法正常工作,并且将 %%dpA 变量与文件名的其余部分结合/连接存在问题。以下代码的结果是文件名和路径之间的双斜杠,或者如果我取出硬编码冲突,那么代码也会失败。

    for /r X:\PATH1\ %%F in (F_0*.txt) do (
    For %%A in (%%F) do (
    For /L %%i in (4395 1 4542)do if /I exist %%dpA\F_0%%i.txt copy %%F E:\PATH2\
    )
)

【问题讨论】:

  • 首先,你是setting 一个变量,你从不使用它。其次,即使你这样做了,你也不能在没有启用delayedexpansion 的情况下使用set 并在这样的代码块中使用变量,但是你甚至不需要在这里设置变量,你可以直接使用%%~dpA
  • 谢谢!我已经更新了代码,仍然无法正常工作,我希望更近一步
  • 您运行 3 个 for 循环的方式为您的脚本创建了大量开销,因为它在下一个循环中多次处理每个 for 循环的项目。为什么不直接运行for /L 循环并迭代文件呢?例如:For /L %%i in (4395,1,4542) do if exist "X:\path\F_0%%i.txt" copy "X:\path\F_0%%i.txt" "E:\PATH2\"
  • 谢谢@Gerhard,你帮了大忙。最终代码在上面

标签: windows batch-file


【解决方案1】:

再次感谢@Gerhard,您在优化方面击败了我,但仍然有很大帮助。这是我的最终代码,它也解决了多个子文件夹,并合并为一行!

setlocal EnableDelayedExpansion
for /L %%i in (43,1,45,) do ((SET "formattedValue=000000%%i" & SET PathSource2=X:Path1Dir_!formattedValue:~-3!) & (For /L %%i in (4395 ,1,4542) do (if exist "!PathSource2!F_0%%i.jpg" copy "!PathSource2!F_0%%i.txt" "E:Path2")))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多