file log batch skrip

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

Saya memiliki file batch di atas yang memanggil beberapa file kelelawar. Saya telah menguji skrip dan bekerja dengan baik.
Satu-satunya masalah saya adalah bahwa file log yang dihasilkan berisi semua informasi, dan ini adalah file yang besar.
Apakah mungkin untuk hanya mencatat komentar dan gema, dan mengecualikan apa yang dieksekusi di layar?
Misalnya saya tidak ingin 1 file dipindahkan ditampilkan di file log.

Jawaban

BenPersonick Oct 17 2020 at 16:03

Saya telah mengambil kode Anda dan menulis ulang untuk menggunakan fungsi generik yang mendeduplikasi kode menjadi bentuk yang lebih mudah dikelola dan memungkinkan Anda untuk menambah atau menghapus langkah apa pun ke bagian FTP dan Script sesuai kebutuhan dengan mengedit daftar variabel.

Saya juga hanya mengembalikan keluaran yang tidak menyertakan "file yang dipindahkan".

Atau jika Anda benar-benar hanya ingin baris status dicetak, Anda dapat mengubahnya menjadi hanya mencetaknya ke log dan tidak memiliki semua info dicetak ke log (ini dilakukan karena Anda mengarahkan pengalihan ke log pada panggilan ke langkah lainnya.

Juga cara ini ditulis sebelum itu benar-benar melalui semua perintah goto dan tidak membutuhkan panggilan ke masing-masing di atas.

Ini adalah kode refactored, saya belum mengujinya tetapi seharusnya baik-baik saja saya harus keluar selama beberapa jam dan Anda dapat mengajukan pertanyaan apa pun dan saya akan dengan senang hati menjawab ketika saya punya waktu.

@( 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