我使用.cmd
文件(在 Windows 7 下)将大量扫描的 PDF 文件从“隔离”文件夹移动到它们的最终位置。
PDF 的文件名从TA500xxxx.PDF
到TA517xxxx.PDF
(其中 xxxx 是从 0001 到 9999 的任意数字)。如果可能的话,我希望能够通过一次操作识别所有文件名低于TA517xxxx.pdf
(即从TA5000001.pdf
到 的所有文件TA5169999.pdf
) 的文件,但 IF EXIST 似乎不接受 '<' 运算符,即 'IF EXIST < TA517*.pdf GOTO....' 不起作用。
我可以为每个文件名块(TA500、TA501 等)使用单独的 IF EXIST 语句,但这似乎有点多余。有没有一种简洁的方法来解决这个问题?
答案1
我完全不知道 IF 语句是否从 stdin 读取/接受数据。我不这么认为,而且我以前从未见过这种情况。
我会做这样的事情:
FOR /L %i IN (500,1,516) DO MOVE TA%i*.pdf target
此循环将把 TA500* 至 TA516* 的每个 PDF 文件移动到目标。
注意:FOR 会删除数字中的前导零,因此有时在执行此类任务时您必须非常有创造力。
答案2
<
和>
是输入/输出重定向操作符在批处理脚本中,您不能使用它们来比较数值。
该if
命令提供以下三字母比较运算符:
EQU - equal
NEQ - not equal
LSS - less than
LEQ - less than or equal
GTR - greater than
GEQ - greater than or equal
这是一个可以帮助您入门的示例脚本:
@echo off
setlocal
setlocal enabledelayedexpansion
REM initialize a patter which matches any .pdf files whose
REM name begins with "TA5" and is followed by 6 characters
set pattern=TA5??????.pdf
REM get all files matching the pattern
REM in the current folder and all subfolders
for /r %%A in ("%pattern%") do (
REM retrieve the current file name
set name=%%~nA
REM get 6 characters from the original name starting from the 4th
set value=!name:~3,6!
REM ensure the value is a valid number through a regular expression
echo "!value!"|findstr "^\"[0-9]*\"$" >nul
if !errorlevel! == 0 (
REM check if the value is smaller than 170000
if !value! leq 169999 (
echo %%A
)))
pause >nul
endlocal & exit /b