2013-01-15 77 views
0

我想创建一个批处理文件。解析文件夹移动文件取决于文件名

它应该让指定源和目标文件夹。源文件夹将被解析,并且根据文件名的一部分,文件将被移动到目标文件夹。源文件夹中会有多个文件需要解析。

的文件会像file-1-tmp.txt, file-2-tmp.txt, file-3-tmp.txt etc. 我看着使用的令牌和delims使用FOR/F命令 - - 但不能让它追索的所有文件夹

如果文件中已经-1-它将被移动到目的地,如果文件已经-2-它将被移动到另一个目的地。

PS:请帮我之前失去我的头发

回答

2

可你就是多个命令,基于@每种类型的文件?:

for %%i in (*-1-*.*) do move "%%i" dir1\. 
for %%i in (*-2-*.*) do move "%%i" dir2\. 
for %%i in (*-3-*.*) do move "%%i" dir3\. 
...etc... 

UPDATE的

Andriy M的建议,更简单的方法是:

for %%n in (1 2 3 <...etc...>) do move *-%%n-*.* dir%%n\. 
+0

简单明了,虽然说实话,我不明白为什么你需要为此使用FOR循环。你可以简单地“移动* -1 - *。* dir1 \'等等,不是吗? –

+0

好点。我原本想把所有这些放在另一个'for'循环中。 (请参阅编辑。) –

+0

我喜欢你的第二个建议。如果数字是连续的,你可以在(1,1,10)do ...中使用'for/l'循环而不是简单的'for':'for/l %% n'(将从1至10)。当然,在这两种情况下,都假设目的地也是基于相同的数字。所以这是一个有点特定的方法,但是,如果适用的话,它可能比我的“通用”循环更有效率。 –

1

可能有多种解决此问题的方法。

例如,您可以对需要移动到相同目标的每组文件使用单独的命令,如@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 
) 
) 
相关问题