2017-03-21 6 views
2

Je veux créer un Filewatcher en batch-file:Filewatcher à décompressez, exécutez et déplacer des fichiers par lots fichier

montre pour le fichier dans dossierA (.zip) → décompressez à FolderB (avec le même nom) → et déclenchez un fichier batch → faites de même pour plus de fichiers .zip entrants.

j'ai vérifié les questions liées à cela dans StackOverflow mais, j'ai besoin de plus d'aide

:STARTPROCESS 
CD /D %ROOT_DIR% 
FOR /F "tokens=1-2 delims=." %%G in ('dir *.zip /b') do 
(
REM unzip file 
%SEVENZIP_PATH%\7z.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%\7z.exe a "%UNZIP_FOLDER%\%G%" -o%ZIP_FOLDER% -y >>%LOG% 
) 
) 

timeout 60 
goto STARTPROCESS 
cmd /k 

Répondre

3

Je vois deux problèmes principaux avec votre code. La première est que vous ne pouvez pas utiliser d'étiquettes à l'intérieur des boucles for. Pour contourner cela, vous pouvez déplacer les étiquettes :BATCH1 et :BATCH2 en dehors de la boucle et dans un sous-programme (bien sûr, %%G n'existera pas en dehors de la boucle, vous devez donc également le passer à la nouvelle sous-routine).

Le deuxième problème que je vois est que vos parenthèses ne sont pas au bon endroit (et peut-être que votre indentation est foiré, mais cela peut avoir juste été une erreur de copie). Le ( d'une boucle for doit être sur la même ligne que do et un autre doit être écrit comme ) else (. Il vous manque également le ( initial dans vos deux déclarations if. Fondamentalement, le lot vous verrouille au style K &.

En fin de compte, votre code va ressembler à quelque chose comme ceci:

:STARTPROCESS 
CD /D %ROOT_DIR% 
FOR /F "tokens=1-2 delims=." %%G in ('dir *.zip /b') do (
    REM unzip file 
    %SEVENZIP_PATH%\7z.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%\7z.exe a "%UNZIP_FOLDER%\%1" -o%ZIP_FOLDER% -y >>%LOG% 
    ) 
) 
+0

cela a fonctionné.! mais j'ai trouvé un autre problème: quand je passe %% G de la boucle principale à la sous-routine (elle passe OK, mais manque le "\") et donc j'obtiens une erreur. comme ceci 'findstr/M" KO "% UNZIP_FOLDER% \% 1 \ Logs \% 1.log' devient 'd: \ LocalData \ \ Desktop \ décompresser" testfile \ Logs "testfile.log' – PrimeSuspect

+0

la partie manquante était de ajouter double \\, j'ai ajouté \\ au% 1 et cela a fonctionné comme prévu. – PrimeSuspect