Filewatcher 在批处理文件中解压缩、运行 和移动文件

Filewatcher to unzip, run and move files in batch-file

我想在批处理文件中创建一个文件观察器:

查看文件夹 A (.zip) 中的文件 → 将它们解压缩到文件夹 B(同名)→ 并触发批处理文件 → 对更多传入的 .zip 文件执行相同操作。

我在 Whosebug 中查看了与此相关的问题,但我需要更多帮助

:STARTPROCESS
CD /D %ROOT_DIR%
FOR /F "tokens=1-2 delims=." %%G in ('dir *.zip /b') do 
(
REM unzip file
%SEVENZIP_PATH%z.exe x "%ROOT_DIR%" -o%UNZIP_FOLDER% -y >> %LOG%
echo %%G -- unzip complete

REM run batch1
:BATCH1

REM check ERROR from batch1 log   --> i have a problem from here nothing below works

findstr /M "ERROR" %UNZIP_FOLDER%\%%G\Logs\*.log 
If %ERRORLEVEL%==0 echo Error Found
move /Y "%UNZIP_FOLDER%\%%G" "%Folder1% >> %LOG%
goto STARTPROCESS
else 
(
echo %%G Batch1 OK
goto BATCH2
)

REM run batch2
:BATCH2

REM check ERROR from batch2 log
findstr /M "Total Count : 0" %UNZIP_FOLDER%\%%G\Data\*_Output.log 
If %ERRORLEVEL%==0 echo %%G Batch2 OK
goto STARTPROCESS
else 
(
echo ERROR
move /Y "%UNZIP_FOLDER%\%%G\fileA.xml" "%UNZIP_FOLDER%\bin >> %LOG%
%SEVENZIP_PATH%z.exe a "%UNZIP_FOLDER%\%G%" -o%ZIP_FOLDER% -y >>%LOG%
)
)

timeout 60
goto STARTPROCESS
cmd /k

我发现您的代码存在两个主要问题。首先是您不能在 for 循环中使用标签。为了解决这个问题,您可以将 :BATCH1:BATCH2 标签移到循环外并移到子例程中(当然, %%G 不会存在于循环外,因此您需要通过它也作为参数传递给新的子程序。

我看到的第二个问题是你的括号不在正确的位置(并且可能你的缩进搞砸了,但这可能只是一个复制错误)。 for循环的(需要和do在同一行,else需要写成) else (。您还缺少两个 if 语句中的初始 (。基本上,批处理将您锁定在 K&R 风格中。

最终,您的代码将如下所示:

:STARTPROCESS
CD /D %ROOT_DIR%
FOR /F "tokens=1-2 delims=." %%G in ('dir *.zip /b') do (
    REM unzip file
    %SEVENZIP_PATH%z.exe x "%ROOT_DIR%" -o%UNZIP_FOLDER% -y >> %LOG%
    echo %%G -- unzip complete

    REM run batch1
    call :BATCH1 "%%~G"
)

timeout 60
goto STARTPROCESS
cmd /k

:BATCH1
REM check ERROR from batch1 log

findstr /M "ERROR" %UNZIP_FOLDER%\%1\Logs\*.log 
If %ERRORLEVEL%==0 (
    echo Error Found
    move /Y "%UNZIP_FOLDER%\%%G" "%Folder1% >> %LOG%
    exit /b
) else (
    echo %%G Batch1 OK

    REM check ERROR from batch2 log
    findstr /M "Total Count : 0" %UNZIP_FOLDER%\%1\Data\*_Output.log 
    If %ERRORLEVEL%==0 (
        echo %%G Batch2 OK
        goto STARTPROCESS
    ) else (
        echo ERROR
        move /Y "%UNZIP_FOLDER%\%%G\fileA.xml" "%UNZIP_FOLDER%\bin >> %LOG%
        %SEVENZIP_PATH%z.exe a "%UNZIP_FOLDER%\%1" -o%ZIP_FOLDER% -y >>%LOG%
    )
)