स्क्रिप्ट बैच की लॉग फ़ाइल

Oct 15 2020
@echo off
    call :checkFTP1 %* > all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :checkFTP2 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :checkFTP3 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :doCommands1 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :doCommands2 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :doCommands3 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    call :doCommands4 %* >> all_log_all_log_%date:~10,4%%date:~4,2%%date:~7,2%.log 2>&1
    exit /b
    
    
:checkFTP1

    @echo off
Setlocal

:: Is folder empty
set _TMP=
for /f "delims=" %%a in ('dir /b "C:\test\folder1"') do set _TMP="%%a"
IF {%_TMP%}=={} (
    goto :Exit1
) ELSE (
    goto :checkFTP2
)
Endlocal


:checkFTP2
    @echo off
Setlocal

:: Is folder empty
set _TMP=
for /f "delims=" %%a in ('dir /b "C:\test\folder2"') do set _TMP="%%a"
IF {%_TMP%}=={} (
    goto :Exit2
) ELSE (
    goto :checkFTP3
)
Endlocal


:checkFTP3
    @echo off
Setlocal

:: Is folder empty
set _TMP=
for /f "delims=" %%a in ('dir /b "C:\test\folder3"') do set _TMP="%%a"
IF {%_TMP%}=={} (
    goto :Exit3
) ELSE (
    goto :doCommands1
)
Endlocal


:doCommands1
    call script1.bat
    if %errorlevel% EQU 0 (goto :doCommands2 ) Else ( ECHO error on script 1 ,2,3,4)
    exit
:doCommands2
    call script2.bat
    if %errorlevel% EQU 0 (goto :doCommands3 ) Else ( ECHO Script 1 Completed  Successfully , ERRORS on  2,3,4)
    exit
:doCommands3
    call script3.bat
    if %errorlevel% EQU 0 (goto :doCommands4) Else ( ECHO Script 2 Completed  Successfully , ERRORS on 3,4)
    exit
:doCommands4
    call script4.bat
    if %errorlevel% EQU 0 (goto :completed1) Else ( ECHO Script 3 Completed  Successfully , ERRORS on  4)
    exit
:Exit1 

Echo Today Date  %DATE%  at %Time%
Echo ###################FTP-1 FILES  MISSING  #########################

Exit

:Exit2

Echo Today Date  %DATE%  at %Time%
Echo ###################FTP-2 FILES  MISSING (#########################

Exit

:Exit3

Echo Today Date  %DATE%  at %Time%
Echo ###################FTP-3 FILES  MISSING   #########################

Exit
    
    
:completed1


Echo Today Date  %DATE%  at %Time%
Echo ###################all scripts  Completed  Successfully#########################

Exit

मेरे पास बैच फ़ाइल है जो कई बैट फ़ाइलों को कॉल करती है। मैंने स्क्रिप्ट का परीक्षण किया है और यह ठीक काम किया है।
मेरा एकमात्र मुद्दा यह है कि लॉग की गई फ़ाइल में सभी जानकारी है, और यह एक बड़ी फ़ाइल है।
क्या केवल टिप्पणियों और प्रतिध्वनि को लॉग करना संभव है, और क्या स्क्रीन में निष्पादित किया गया है?
उदाहरण के लिए, मैं नहीं चाहता कि 1 फ़ाइल लॉग फ़ाइल में दिखाई जाए।

जवाब

BenPersonick Oct 17 2020 at 16:03

मैंने आपका कोड ले लिया है और जेनेरिक फ़ंक्शंस का उपयोग करने के लिए इसे फिर से लिखा है जो कोड को अधिक आसानी से प्रबंधित रूप में काटता है और आपको चर की सूची को संपादित करके एफ़टीपी और स्क्रिप्ट अनुभागों में किसी भी चरण को जोड़ने या हटाने की अनुमति देता है।

मैं केवल आउटपुट भी लौटाता हूं जिसमें "फाइल (एस) स्थानांतरित" शामिल नहीं है।

वैकल्पिक रूप से यदि आप वास्तव में केवल चाहते हैं कि स्थिति रेखाएं प्रिंट करें तो आप इसे बदल सकते हैं बस उन प्रिंट को लॉग में डाल सकते हैं और लॉग के लिए सभी जानकारी प्रिंट नहीं है (यह इसलिए किया जा रहा है क्योंकि आप कॉल पर लॉग पर रीडायरेक्ट को डाल रहे हैं अन्य कदम।

इसके अलावा जिस तरह से यह पहले लिखा गया था वह वास्तव में सभी गोटो कमांड से गुजर रहा था और शीर्ष पर प्रत्येक को कॉल की आवश्यकता नहीं थी।

यहाँ पर रिफलेक्ट किया गया कोड है, मैंने इसका परीक्षण नहीं किया है, लेकिन यह ठीक होना चाहिए कि मुझे कुछ घंटों के लिए बाहर जाना होगा और आप कोई भी प्रश्न पूछ सकते हैं और जब मेरे पास समय होगा तो मुझे उत्तर देने में खुशी होगी।

@( Setlocal EnableDelayedExpansion 
  echo off
  SET "_FolderList="C:\test\folder1" "C:\test\folder1" "C:\test\folder1" "
  SET "_ScriptList="c:\test\script1.bat" "E:\script2.bat" "C:\Path\To\script3.bat" "C:\Path\To\script4.bat" "
  SET "_Scripts_Failed=1,2,3,4"
  SET "_Scripts_Completed="
  SET "_Continue=0"
  CALL :GetDateTime
  SET "MasterLog=all_log_all_log_!IsoDate!_!IsoTime!.log"
)

CALL :Main

( Endlocal
  EXIT /B
)

:Main
  SET /A "_Counter=0"
  FOR %%_ IN (%_FolderList%) DO (
    IF DEFINED _Continue (
      SET /A "_Counter+=1"
      CALL :CheckFTP_List %%~_
    )
  )>> "%MasterLog%"
  SET /A "_Counter=0"
  FOR %%_ IN (%_FolderList%) DO (
    IF DEFINED _Continue (
      SET /A "_Counter+=1"
      CALL :DoCommands_List %%~_
    )
  )>> "%MasterLog%"
  IF DEFINED _Continue (
    Echo Today Date  %DATE%  at %Time%
    Echo ###################all scripts  Completed Successfully#########################
  )
GOTO :EOF
  
  
:CheckFTP_List
  REM Is folder empty
  for /f "delims=" %%a in ('dir /b /A-D "%*') do (
    set "_Continue=%%a" )
  IF NOT Defined _Continue (
    Echo.Today Date on %DATE%  at %Time%
    Echo.###################FTP-%_Counter% FILES  MISSING  #########################
  )
GOTO :EOF

:DoCommands_List
  call "*%" | FIND /I /V "file(s) moved" &REM only outputs lines that don't contain files moved.
  if %errorlevel% NEQ 0 (
    SET "_Continue="
    SET "_Scripts_Completed=%_Scripts_Completed:,1=1%"
    SET "_Scripts_Failed=!_Scripts_Failed:%_Scripts_Completed%=!"
    Echo Today Date  %DATE%  at %Time%
    ECHO. Error encountered on Script %Counter%! -- Completed Scripts: !_Scripts_Completed! -- Failed Scripts: !_Scripts_Failed!
  ) ELSE (
    SET "_Scripts_Completed=%_Scripts_Completed:,1=1%,%Counter%"
  )
GOTO :EOF



:GetDateTime
  FOR /F "Tokens=1-7 delims=MTWFSmtwfsouehrandit:-\/. " %%A IN ("%DATE% %TIME: =0%") DO (
    FOR /F "Tokens=2-4 Delims=(-)" %%a IN ('ECHO.^| DATE') DO (
      SET "%%~a=%%~A"
      SET "%%~b=%%~B"
      SET "%%~c=%%~C"
      SET "HH=%%~D"
      SET "Mn=%%~E"
      SET "SS=%%~F"
      SET "Ms=%%~G"
    )
  )
  SET "IsoTime=%HH%.%Mn%.%SS%.%Ms%"
  SET "IsoDate=%yy%-%mm%-%dd%"
GOTO :EOF