将基于文件名的单个目录中的多个文件移动到多个文件夹

时间:2016-11-22 17:06:05

标签: batch-file

首先,先感谢您的帮助。我试图做的是:

1)我有一个包含名称为

的文件的文件夹
122098_482056_1453458.xls
122098_482057_1453459.jpg
122098_482057_1453460.xls
122098_482056_1453457.jpg

2)我想将这些文件移动到我用名称创建的文件夹:

PO_90_122118_0_US
PO_90_122122_0_US
PO_90_122098_0_US

注意:文件夹名称的第3部分与文件名的第一部分匹配。

我尝试了以下脚本,导致错误分别没有做任何事情。

我使用delims=_,因为我的文件名由字符_分隔。 使用tokens=1以便使用文件名的第一部分。

@ECHO OFF
SETLOCAL
SET "sourcedir=D:\2009\2nd step batch - Copy"
SET "destdir=D:\2009\1st step batch"
FOR /f "delims=_" %%I IN (
  'dir /b /ad "%destdir%\*" '
 ) DO (
 FOR /f "tokens=1delims=(" %%s IN ("%%~I") DO (
  IF EXIST "%sourcedir%\%%s*" ECHO(MOVE "%sourcedir%\%%s*" "%destdir%\%%I\"
 )
)

GOTO :EOF

此批处理文件不输出任何行,这意味着没有找到要移动的文件,我不知道原因。

将所有122098_*个文件移至文件夹PO_90_122118_0_US的批处理代码有什么问题?

1 个答案:

答案 0 :(得分:0)

以下是为此任务重写的批处理代码。

@ECHO OFF
SETLOCAL
SET "SourceDir=D:\2009\2nd step batch - Copy"
SET "DestDir=D:\2009\1st step batch"
FOR /F "tokens=1-3* delims=_" %%A IN ('DIR /AD /B "%DestDir%\*" 2^>nul') DO (
    IF EXIST "%SourceDir%\%%C_*" MOVE "%SourceDir%\%%C_*" "%DestDir%\%%A_%%B_%%C_%%D\"
)
ENDLOCAL

在没有 ECHO 的情况下,在第二次运行中真正移动文件之前,您可以将 ECHO 插入 MOVE 以测试批处理文件。

对于目标目录中找到的每个子目录,目录名称使用下划线作为分隔符分为4个令牌。

  1. PO被分配给 FOR 命令行中定义的循环变量A
  2. 90被分配到ASCII table中的B的下一个循环变量。
  3. 122098或其他真正感兴趣的数字被分配给循环变量C
  4. 并且在子目录名称中的第三个下划线之后的所有内容都被分配给循环变量D,而不会进一步分割。
  5. IF 条件检查是否有任何文件以分配给循环变量C的子目录名称和下划线开头。如果此条件为真,则移动相应的文件。

    将子目录名称的所有4个部分指定为目标目录很重要,即当前子目录的完整名称。

    要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

    • echo /?
    • endlocal /?
    • for /?
    • if /?
    • move /?
    • set /?
    • setlocal /?

    2^>nul重定向由 DIR 命令输出的令人困惑的错误消息,以便在设备找不到子目录的情况下处理 STDERR NUL 压制它。必须使用>对重定向运算符^进行转义,以便在执行命令 DIR 时将其解释为重定向运算符,而不是作为命令 FOR 。另请参阅Microsoft文章Using command redirection operators