可能有多种解决此问题的方法。
例如,您可以对需要移动到相同目标的每组文件使用单独的命令,如@Loadmaster's answer。
一个非常不同的方法是迭代所有文件,随时确定每个文件的目的地。该办法的实施可能是这样的:
@ECHO OFF
FOR %%I IN ("D:\path\to\source\file-*-tmp.txt") DO (
FOR /F "tokens=2 delims=-" %%C IN ("%%C") DO (
IF %%C == 1 (
MOVE %%I D:\path\to\destination\1
) ELSE IF %%C == 2 (
MOVE %%I D:\path\to\destination\2
) ELSE IF ...
...
)
)
也就是说,你遍历存储在特定文件夹中的文件,并使用一个简单的循环FOR
匹配特定的面具。在循环体中,使用另一个循环(FOR /F
)来拆分名称并转到确定目标的部分。获得该部分后,使用一组嵌套的IF
命令将其单独与所有可能的值进行比较,并且对于每个匹配,您可以指定MOVE
命令来相应地放置文件。
您还可以修改上述脚本,使其更方便地指定目标路径。特别是,您可以在脚本的开头准备一组包含所有可能的目标路径的变量。在内部循环的主体中,您将只使用一个来确定是否存在与提取部分相对应的“目标变量”,而不是多个IF
。如果是这样,您只需使用存储在该变量中的路径将文件移动到。下面是如何实现这种变化:
@ECHO OFF
SETLOCAL
SET "dest1=D:\path\to\destination\1"
SET "dest2=D:\path\to\destination\2"
...
FOR %%I IN ("D:\path\to\source\file-*-tmp.txt") DO (
FOR /F "tokens=2 delims=-" %%C IN ("%%C") DO (
SETLOCAL EnableDelayedExpansion
IF DEFINED dest%%C MOVE %%I !dest%%C!
ENDLOCAL
)
)
简单明了,虽然说实话,我不明白为什么你需要为此使用FOR循环。你可以简单地“移动* -1 - *。* dir1 \'等等,不是吗? –
好点。我原本想把所有这些放在另一个'for'循环中。 (请参阅编辑。) –
我喜欢你的第二个建议。如果数字是连续的,你可以在(1,1,10)do ...中使用'for/l'循环而不是简单的'for':'for/l %% n'(将从1至10)。当然,在这两种情况下,都假设目的地也是基于相同的数字。所以这是一个有点特定的方法,但是,如果适用的话,它可能比我的“通用”循环更有效率。 –