在批处理中使用类似于FOR /F, FIND /C等命令命名的文件有问题



我在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

最新更新