我试图根据其作者姓名移动文件(书)。 例如:
[author] Title 1.pdf
[author2] Title A.pdf
我为此找到了一个批处理脚本
@echo off
for %%i in (*) do (
if not "%%~ni" == "organize" (
md "%%~ni" && move "%%~i" "%%~ni"
)
)
它可以工作,但是它为每个文件创建了每个文件夹,我要做的是通过作者姓名创建文件夹并将其移动到那里。
注意:所有作者名称的文件名中都带有“ []”,但是创建的文件夹中的作者名称中没有“ []”。
请帮助,我有4000多个文件需要排序。
答案 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
部分将禁止显示错误消息。
在测试了正确的输出之后,从ECHO
和md
命令行中删除大写的move
命令。为避免出现多条1 file(s) moved.
消息,请将 SPACE + > nul
附加到move
命令行中。
\
命令目的地的结尾move
旨在强制其指向目录。想象一下,由于某种原因(例如,缺少访问权限)无法创建目标目录,没有\
的目标被解释为工作目录中的新文件名,从而导致无意重命名;使用\
的{{1}}命令需要一个现有目录,如果找不到,则会出现错误。
除了您的代码未尝试按需要分割文件名这一事实外,还有另一个问题:&&
operator仅在前一个命令成功的情况下使以下命令执行;因此,move
失败时,md
不会运行。例如,您有两个具有相同作者的文件,因此在迭代第二个文件时,由于目标目录是在先前的迭代中创建的,因此目标目录已经存在,因此move
失败并且相应的文件不会移动。因此,您应该使用无条件的&
operator。