基于文件名前几个文本的批处理移动文件

时间:2019-12-24 10:15:16

标签: windows batch-file cmd

我试图根据其作者姓名移动文件(书)。 例如:

[author] Title 1.pdf
[author2] Title A.pdf

我为此找到了一个批处理脚本

@echo off
for %%i in (*) do (
 if not "%%~ni" == "organize" (
  md "%%~ni" && move "%%~i" "%%~ni"
 )
)

它可以工作,但是它为每个文件创建了每个文件夹,我要做的是通过作者姓名创建文件夹并将其移动到那里。

注意:所有作者名称的文件名中都带有“ []”,但是创建的文件夹中的作者名称中没有“ []”。

请帮助,我有4000多个文件需要排序。

1 个答案:

答案 0 :(得分:3)

以下脚本使用for /F loop来拆分dir command收集的文件名:

@echo off
for /F "tokens=1* delims=[] eol=]" %%I in ('dir /B /A:-D-H-S "[*]*.pdf"') do (
    ECHO md "%%I" 2> nul
    ECHO move "[%%I]%%J" "%%I\"
)

如果要创建的目录已经存在,2> nul部分将禁止显示错误消息。

在测试了正确的输出之后,ECHOmd命令行中删除大写的move命令。为避免出现多条1 file(s) moved.消息,请将 SPACE + > nul附加到move命令行中。


\命令目的地的结尾move旨在强制其指向目录。想象一下,由于某种原因(例如,缺少访问权限)无法创建目标目录,没有\的目标被解释为工作目录中的新文件名,从而导致无意重命名;使用\的{​​{1}}命令需要一个现有目录,如果找不到,则会出现错误。


除了您的代码未尝试按需要分割文件名这一事实外,还有另一个问题:&& operator仅在前一个命令成功的情况下使以下命令执行;因此,move失败时,md不会运行。例如,您有两个具有相同作者的文件,因此在迭代第二个文件时,由于目标目录是在先前的迭代中创建的,因此目标目录已经存在,因此move失败并且相应的文件不会移动。因此,您应该使用无条件的& operator