Batch file 使用FOR/F、FIND/C等命令批处理类似名称的文件时出现问题
我已经批量编写了一个小程序,它将一对PDF和一个控制文件一起打包,然后发送给我们公司的另一个团队。我最近扩展了这个程序来处理其他类型的PDF,但是这些附加类型的名称与我的程序中先前存在的导致问题的名称类似 下面是我的代码:Batch file 使用FOR/F、FIND/C等命令批处理类似名称的文件时出现问题,batch-file,pdf,for-loop,find,Batch File,Pdf,For Loop,Find,我已经批量编写了一个小程序,它将一对PDF和一个控制文件一起打包,然后发送给我们公司的另一个团队。我最近扩展了这个程序来处理其他类型的PDF,但是这些附加类型的名称与我的程序中先前存在的导致问题的名称类似 下面是我的代码: :ZIPPAIRS ::Zips pairs -- checks for pairs first using filelist.txt ECHO [INFO] Checking for pairs, if a pair exists, zipping it up >&g
:ZIPPAIRS
::Zips pairs -- checks for pairs first using filelist.txt
ECHO [INFO] Checking for pairs, if a pair exists, zipping it up >> %LOG%
ECHO.
ECHO Zipping all pairs from your PDFCOMPARE folder...
ECHO.
CD %DRIVE%\PDFCompareApp\PDFCOMPARE
FOR /F "delims=|" %%i IN (filelist.txt) DO (
SETLOCAL EnableDelayedExpansion
CD %DRIVE%\PDFCompareApp\PDFCOMPARE
SET COMPAREZIPS="dir /b "%%i*.pdf" | find /c "%%i" "
FOR /F %%j IN (' !COMPAREZIPS! ') DO SET X=%%j
IF !X! EQU 2 (
ECHO [INFO] Zipping %%i PDF's and control_file.xml >> %LOG%
ECHO Zipping %%i PDF's and control_file.xml...
%DRIVE%\PDFCompareApp\7-ZIP\7z a %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i.zip %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i*.* %DRIVE%\PDFCompareApp\PDFCOMPAREDOWNLOADED\control_file.xml
ECHO.
ECHO [INFO] Moving %%i PDF's >> %LOG%
ECHO Moving %%i PDF's
ECHO.
MOVE %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i*.pdf %DRIVE%\PDFCompareApp\PDFCOMPARE\FINISHED
MOVE %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i*.zip %DRIVE%\PDFCompareApp\PDFCOMPARE\ZIPS
) ELSE (
ECHO.
ECHO.
ECHO [WARN] This compare %%i does not have a matching pair >> %LOG%
ECHO This compare %%i does not have a matching pair
ECHO.
ECHO.
)
SET i=""
SET j=""
SET X=""
ENDLOCAL
)
下面是filelist.txt的一个示例
2174_1_1_TEST_|
2174_1_1_TEST_SO_|
2174_1_1_ABC_|
2174_1_1_ABC_DEF_|
2174_1_1_XYZ_MNO_|
998014_YOYO_SP_|
998014_YOYO_|
998014_MAILMAN_|
998014_BATMAN_|
998014_SPIDERMAN_|
998014_CATWOMAN_|
311009_SUPERMAN_|
最后,这里是PDFCOMPARE文件夹中PDF的一个子集:
2174_1_1_TEST_dev.pdf
2174_1_1_TEST_qa.pdf
2174_1_1_TEST_SO_dev.pdf
2174_1_1_TEST_SO_qa.pdf
最后一个后缀可能会根据PDF来自哪个环境而改变,但此时它只能来自4个:dev、qa、uat、prod(如果此信息有帮助的话)
该程序在这一行有问题:
SET COMPAREZIPS="dir /b "%%i*.pdf" | find /c "%%i" "
如果程序确实找到了两个类似命名的文件,那么这一行总是应该是2,但是根据上面的例子,当它在filelist.txt中点击2174_1_1_TEST_124;
时,它会找到4,当它在filelist.txt中点击2174_1_TEST_SO|
时,它会找到2
如果有帮助,问题只存在于TEST/TEST_SO、ABC/ABC_DEF、YOYO/YOYO_SP文件中
我已经尝试了很多事情(更改FOR循环、调整重定向/管道等),但我还是不停地挠头。我相信这很简单,但我失败了,请求SO的帮助。请帮忙
提前谢谢你 您可以更改
for
命令以显式搜索所需内容
SET "COMPAREZIPS=dir /b "%%idev.pdf" "%%iqa.pdf" "%%iuat.pdf" "%%iprod.pdf" ^| find /c "%%i" "
或者添加一个过滤器,以确保仅统计已分析的文件
SET "COMPAREZIPS=dir /b "%%i*.pdf" ^| findstr /i /r /c:"^%%i[^_]*\.pdf$" ^| find /c "%%i" "
这将解决文件计数问题,但无法避免使用%%i*.pdf
处理文件的其余命令的问题
因此,最好首先检索将在每次迭代中处理的文件列表,然后使用此列表执行其余命令
:ZIPPAIRS
::Zips pairs -- checks for pairs first using filelist.txt
ECHO [INFO] Checking for pairs, if a pair exists, zipping it up >> %LOG%
ECHO.
ECHO Zipping all pairs from your PDFCOMPARE folder...
ECHO.
setlocal enableextensions disabledelayedexpansion
set "sources=dev qa uat prod"
set "tempFile=%temp%\%~nx0.%random%.tmp"
pushd "%DRIVE%\PDFCompareApp\PDFCOMPARE"
FOR /F "delims=|" %%i IN (filelist.txt) DO (
:: Search for required files
dir /b "%%idev.pdf" "%%iqa.pdf" "%%iuat.pdf" "%%iprod.pdf" > "%tempFile%"
for /f %%j in (
' ^<"%tempFile%" find /i /c "%%i" '
) do if %%j equ 2 (
ECHO [INFO] Zipping %%i PDF's and control_file.xml >> %LOG%
ECHO Zipping %%i PDF's and control_file.xml...
%DRIVE%\PDFCompareApp\7-ZIP\7z a %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i.zip @"%tempFile%" %DRIVE%\PDFCompareApp\PDFCOMPAREDOWNLOADED\control_file.xml
ECHO.
ECHO [INFO] Moving %%i PDF's >> %LOG%
ECHO Moving %%i PDF's
ECHO.
for /f "usebackq delims=" %%k in ("%tempFile%") do MOVE %DRIVE%\PDFCompareApp\PDFCOMPARE\%%k %DRIVE%\PDFCompareApp\PDFCOMPARE\FINISHED
MOVE %DRIVE%\PDFCompareApp\PDFCOMPARE\%%i*.zip %DRIVE%\PDFCompareApp\PDFCOMPARE\ZIPS
) else (
ECHO.
ECHO.
ECHO [WARN] This compare %%i does not have a matching pair >> %LOG%
ECHO This compare %%i does not have a matching pair
ECHO.
ECHO.
)
)
popd
del /q "%tempFile%" >nul 2>nul
endlocal
:ZIPPAIRS
::Zips pairs--首先使用filelist.txt检查pairs
ECHO[INFO]检查配对,如果配对存在,则将其压缩>>%LOG%
回声。
ECHO正在压缩PDFCOMPARE文件夹中的所有对。。。
回声。
setlocal enableextensions disabledelayedexpansion
设置“源=开发qa uat产品”
设置“tempFile=%temp%\%~nx0.%random%.tmp”
pushd“%DRIVE%\PDFCompareApp\PDFCOMPARE”
对于(filelist.txt)中的/F“delims=|”%%i,请执行以下操作(
::搜索所需的文件
目录/b“%%idev.pdf”“%%iqa.pdf”“%%iuat.pdf”“%%iprod.pdf”>%tempFile%
对于/f%%j英寸(
“^>%LOG%
ECHO压缩%%i PDF和control_file.xml。。。
%驱动器%\PDFCompareApp\7-ZIP\7z a%DRIVE%\PDFCompareApp\PDFCOMPARE\%i.ZIP@“%tempFile%”驱动器%\PDFCompareApp\PDFCOMPAREDOWNLOADED\control\u file.xml
回声。
ECHO[INFO]移动%%i PDF的>>%LOG%
回音移动%%i PDF
回声。
对于/f“usebackq delims=“%%k in”(“%tempFile%”)执行移动%DRIVE%\PDFCompareApp\PDFCOMPARE\%%k%DRIVE%\PDFCompareApp\PDFCOMPARE\FINISHED
移动%DRIVE%\PDFCompareApp\PDFCOMPARE\%i*.zip%DRIVE%\PDFCompareApp\PDFCOMPARE\ZIPS
)否则(
回声。
回声。
ECHO[警告]此比较%%i没有匹配对>>%LOG%
回显此比较%%i没有匹配的对
回声。
回声。
)
)
邻苯二胺
删除/q“%tempFile%”>nul 2>nul
端部
感谢您详尽的回答!但是在这一行,for/f%%k in(“%tempFile%”)domove%DRIVE%\PDFCompareApp\PDFCOMPARE\%%k%DRIVE%\PDFCompareApp\PDFCOMPARE\FINISHED
它没有将文件移动到完成的目录:(.当我打开ECHO
时,它一直说文件不存在(而且文件名非常奇怪[像临时文件])@RichardS,对不起,是我的错。我忘了为命令选项添加。答案已更正。