我在Batch中编写了一个小程序,该程序需要一对pdf和一个控制文件,并将它们压缩发送给我们公司的另一个团队。我最近扩展了这个程序来处理其他类型的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.
CD %DRIVE%PDFCompareAppPDFCOMPARE
FOR /F "delims=|" %%i IN (filelist.txt) DO (
SETLOCAL EnableDelayedExpansion
CD %DRIVE%PDFCompareAppPDFCOMPARE
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%PDFCompareApp7-ZIP7z a %DRIVE%PDFCompareAppPDFCOMPARE%%i.zip %DRIVE%PDFCompareAppPDFCOMPARE%%i*.* %DRIVE%PDFCompareAppPDFCOMPAREDOWNLOADEDcontrol_file.xml
ECHO.
ECHO [INFO] Moving %%i PDF's >> %LOG%
ECHO Moving %%i PDF's
ECHO.
MOVE %DRIVE%PDFCompareAppPDFCOMPARE%%i*.pdf %DRIVE%PDFCompareAppPDFCOMPAREFINISHED
MOVE %DRIVE%PDFCompareAppPDFCOMPARE%%i*.zip %DRIVE%PDFCompareAppPDFCOMPAREZIPS
) 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, wat, prod(如果这个信息有帮助的话)。
程序在这一行有问题:
SET COMPAREZIPS="dir /b "%%i*.pdf" | find /c "%%i" "
如果程序确实找到了2个类似命名的文件,那么这一行应该总是2,但是根据上面的例子,当它在filelist.txt中找到2174_1_1_TEST_|
时,它找到了4,当它在filelist.txt中找到2174_1_1_TEST_SO_|
时,它找到了2。
如果有帮助,问题只存在于TEST/TEstrongO, 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%PDFCompareAppPDFCOMPARE"
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%PDFCompareApp7-ZIP7z a %DRIVE%PDFCompareAppPDFCOMPARE%%i.zip @"%tempFile%" %DRIVE%PDFCompareAppPDFCOMPAREDOWNLOADEDcontrol_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%PDFCompareAppPDFCOMPARE%%k %DRIVE%PDFCompareAppPDFCOMPAREFINISHED
MOVE %DRIVE%PDFCompareAppPDFCOMPARE%%i*.zip %DRIVE%PDFCompareAppPDFCOMPAREZIPS
) 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