【发布时间】: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