我想将某些 PDF 移动到与其文件号对应的文件夹中。
例如, PDF文件名:403property.pdf
移至文件夹名称:403
我正在处理大量 PDF,我想将它们移动到自己的文件夹中,以便可以组织它们。
我希望将批处理放入文件夹中,一旦批处理放入文件夹中,它会将 PDF 移动到相应的文件夹中。
我真的很感谢您的帮助。
这是此文件移动任务的批处理代码:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "ErrorDetected="
for /F "delims=" %%I in ('dir "%~dp0*.pdf" /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /R "^[0123456789]"') do call :ProcessFile "%%~dp0%%I"
if defined ErrorDetected pause
exit /b
:ProcessFile
set "FileName=%~n1"
set "Number="
:GetFileNumber
set "Number=%Number%%FileName:~0,1%"
set "FileName=%FileName:~1%"
for /F "tokens=* delims=0123456789" %%J in ("%FileName%") do if not "%FileName%" == "%%J" goto GetFileNumber
:CreateFolder
md "%~dp1%Number%" 2>nul
if not exist "%~dp1%Number%\" (
echo ERROR: Failed to create directory: "%~dp1%Number%"
set "ErrorDetected=1"
goto :EOF
)
move /Y %1 "%~dp1%Number%\" >nul 2>nul
if errorlevel 1 (
echo ERROR: Failed to move file: %1
set "ErrorDetected=1"
)
goto :EOF
带有所使用选项的命令 FOR 首先使用
%ComSpec% /c
在后台启动另一个命令进程,并将 '
中的命令行作为附加参数附加。
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
nul
、2>nul
和 |
的说明。重定向运算符 >
和 |
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行命令 FOR(执行嵌入的 )之前处理此命令行时将其解释为文字字符dir
和 finstr
命令行,使用在后台启动的单独命令进程。
第二个
cmd.exe
实例运行内部命令DIR来输出与批处理文件目录中找到的通配符模式*.pdf
匹配的所有文件(不是目录)。 DIR 输出的文件名列表通过管道传输到 FINDSTR,后者搜索以数字开头的行,并仅输出以至少一位数字开头的文件名。
FINDSTR的输出被FOR捕获并在启动后逐行处理
cmd.exe
在执行完命令行后自行终止。
文件名可以包含一个或多个空格。因此,有必要使用
delims=
定义一个空的字符串分隔符列表,以获取带有扩展名但不带路径的完整文件名,并将其分配给指定的循环变量 I
。文件名与被调用子例程的完整路径一起传递 ProcessFile
。
Windows 命令处理器
cmd.exe
设计用于运行命令和可执行文件,而不是字符串操作。因此,决定使用 Windows 上默认安装的所有脚本解释器(最旧的、不支持简单字符串操作的脚本解释器)并不是一个明智的决定。但是,可以获取每个 PDF 文件名开头的数字,以数字作为第一个字符,并具有文件扩展名 .pdf
(长或短文件名),如查看标签下面的三行所示GetFileNumber
。 FOR /F 选项 tokens=* delims=0123456789
会删除文件名字符串开头的所有数字,并将文件名的其余部分分配给指定的循环变量 J
。
接下来根据编号创建子目录,并抑制命令MD输出的错误消息,如果此操作失败,例如目录已存在或由于其他原因。
接下来检查批处理目录中是否存在具有从文件名确定的编号的子目录,如果不存在,则输出错误消息以通知批处理文件的用户有关此错误的信息。
否则,文件将根据文件名开头的数字移动到子目录中。由于各种原因,该操作也可能会失败,在这种情况下,会出现一条错误消息,告知用户此错误。
注意: 如果现有文件设置了只读属性,则无论使用选项 /Y
,命令
MOVE都会提示用户是否应覆盖目标目录中的现有文件。由于
>nul
,提示不可见。因此,如果您检测到批处理文件似乎挂起,请按 N 选择不覆盖现有的只读文件。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
call /?
...还解释了%~dp0
(参数0的驱动器和路径...批处理文件路径)和%~1
(没有周围的"
的参数1)以及所有其他参数引用cmd /?
dir /?
echo /?
exit /?
findstr /?
for /?
goto /?
if /?
md /?
move /?
pause /?
set /?
setlocal /?