File 解析文件夹根据文件名移动文件

File 解析文件夹根据文件名移动文件,file,parsing,batch-file,dos,File,Parsing,Batch File,Dos,我正在尝试创建一个批处理文件 它应该允许指定源文件夹和目标文件夹。将解析源文件夹,并根据文件名的一部分将文件移动到目标文件夹。源文件夹中将有多个文件要分析 这些文件类似于file-1-tmp.txt、file-2-tmp.txt、file-3-tmp.txt等。 我研究了使用FOR/F命令使用的令牌和delims of-,但无法使其对文件夹中的所有文件进行追索 如果文件具有-1-它将被移动到目标如果文件具有-2-它将被移动到另一个目标 ps:在我松开所有头发之前,请帮助我你能做多个命令吗,每种文

我正在尝试创建一个批处理文件

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

这些文件类似于
file-1-tmp.txt、file-2-tmp.txt、file-3-tmp.txt等。
我研究了使用FOR/F命令使用的令牌和delims of-,但无法使其对文件夹中的所有文件进行追索

如果文件具有-1-它将被移动到目标如果文件具有-2-它将被移动到另一个目标


ps:在我松开所有头发之前,请帮助我

你能做多个命令吗,每种文件一个命令吗

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...
更新

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

for %%n in (1 2 3 <...etc...>) do move *-%%n-*.* dir%%n\.
对于(1 2 3)中的%%n,执行移动*-%n-*.*dir%%n\。

您可以只执行多个命令,每种类型的文件一个命令吗?:

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...
更新

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

for %%n in (1 2 3 <...etc...>) do move *-%%n-*.* dir%%n\.
对于(1 2 3)中的%%n,执行移动*-%n-*.*dir%%n\。

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

例如,您可以对需要移动到同一目标的每一组文件使用单独的命令,如中所示

另一种完全不同的方法是迭代所有文件,在运行时确定每个文件的目的地。此方法的实现可能如下所示:

@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
循环匹配特定掩码。在循环体中,您使用另一个循环,即/Fone的
,来分割名称并到达确定目标的部分。获得该零件后,使用一组嵌套的
IF
命令将其与所有可能的值分别进行比较,并为每个匹配指定一个
MOVE
命令以相应地放置文件

您还可以修改上面的脚本,以便更方便地指定目标路径。特别是,您可以在脚本的开头准备一组包含所有可能的目标路径的变量。在内部循环的主体中,您将只使用一个来确定是否存在与提取零件对应的“目标变量”,而不是多个
IF
s。如果是,则只需使用该变量中存储的路径将文件移动到。以下是如何实现此变体:

@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
  )
)

解决这个问题可能有多种方法

例如,您可以对需要移动到同一目标的每一组文件使用单独的命令,如中所示

另一种完全不同的方法是迭代所有文件,在运行时确定每个文件的目的地。此方法的实现可能如下所示:

@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
循环匹配特定掩码。在循环体中,您使用另一个循环,即/F
one的
,来分割名称并到达确定目标的部分。获得该零件后,使用一组嵌套的
IF
命令将其与所有可能的值分别进行比较,并为每个匹配指定一个
MOVE
命令以相应地放置文件

您还可以修改上面的脚本,以便更方便地指定目标路径。特别是,您可以在脚本的开头准备一组包含所有可能的目标路径的变量。在内部循环的主体中,您将只使用一个来确定是否存在与提取零件对应的“目标变量”,而不是多个
IF
s。如果是,则只需使用该变量中存储的路径将文件移动到。以下是如何实现此变体:

@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
  )
)

简单明了,但老实说,我不明白为什么需要为此使用
循环。你可以简单地
move*-1-*.*dir1\
等等,不是吗?很好。我最初考虑将所有这些放在另一个
for
循环中。(见编辑)我喜欢你的第二个建议。如果这些数字是连续的,您也可以使用
for/l
循环,而不是简单的
for
for/l%%n in(1,1,10)do…
(将从1迭代到10)。当然,在这两种情况下,假设目的地也基于相同的数字。因此,这是一种有点特殊的方法,尽管,如果适用的话,它可能比我的“通用”循环更有效。简单明了,但是,老实说,我不明白为什么需要使用
进行
循环。你可以简单地
move*-1-*.*dir1\
等等,不是吗?很好。我最初考虑将所有这些放在另一个
for
循环中。(见编辑)我喜欢你的第二个建议。如果这些数字是连续的,您也可以使用
for/l
循环,而不是简单的
for
for/l%%n in(1,1,10)do…
(将从1迭代到10)。当然,在这两种情况下,假设目的地也基于相同的数字。所以这是一种有点特殊的方法,尽管如果适用,它可能比我的“通用”循环更有效。