******************************************** * Description: Windows batch scripting tips * Date: 05:59 PM EST, 09/06/2017 ******************************************** <1> Turn on/off script execution process within the command line: | |__ CMD> @echo off | |__ CMD> @echo on <2> Comment comparison of "::" and "REM": | |__ REM: all the commented content will show up during script execution. | |__ "::": the commented content will not show up when script got executed from command line. <3> Print a blank line on command line: | |__ Sometimes, command line output should be friendly readable by seperated by blank line. | |__ CMD> echo. | |__ CMD> echo[ | |__ CMD> echo( <4> Hidden the errors thrown out by command: | |__ CMD> forfiles /P %LOG_LOCATION% /M Critical_Log_PS_* /D -1 /C "cmd /c Del @FILE" | | CAUTION: when above command can not find the target files to delete, error will show up "System could not find sepacific files to delete". | |__ CMD> forfiles /P %LOG_LOCATION% /M Critical_Log_PS_* /D -1 /C "cmd /c Del @FILE" > nul 2> nul <5> Condition "if" can not includes multiple commands, calling a seperated functin as work aroudn: | |__ CMD> if %var_count% LSS %~2 | ( | echo %filedatetime% > %LOG_LOCATION%\Critical_Email_PS_Status_%~1.txt | echo.>> %LOG_LOCATION%\Critical_Email_PS_Status_%~1.txt | echo Critical Alert for Process Scheduler - %~1 in critical state >> %LOG_LOCATION%\Critical_Email_PS_Status_%~1.txt | %email_client% %LOG_LOCATION%\Critical_Email_PS_Status_%~1.txt -to %criticalEmail% -subject "CRITICAL:%server%:ManTech - %~1 Process Scheduler in Critical State" | ) | | |__ CMD> if %var_process_count% LSS %~2 ( call :func_email_log %var_process_schedule_name% %var_process_count% ) <6> When sending email via msmtp, there should be a blank line between address section and main body section. CAUTION: no space in between "echo" and ">>": | |__ CMD> echo to: support@emeralit.com > email.txt echo from: sqlmail@emeralit.com >> email.txt echo subject: Test Email >> email.txt echo.>> email.txt type email_body.txt >> email.txt msmtp -t < email.txt <7> Sometimes, script functions normally on command line, but failed on task scheduler. One of the reasons is that the referred external script is not indicated with full path: | |__ CMD> for /f "delims=" %%a in ('sqlplus -s / as sysdba @file_archivelog_sequence.sql') do @set var_sequence=%%a | |__ CMD> for /f "delims=" %%a in ('sqlplus -s / as sysdba @%var_script_location%\file_archivelog_sequence.sql') do @set var_sequence=%%a <7> In Windows OS, if the full path containing space, then doule quote are needed when issue from batch script: | |__ CMD> C:\"Program Files"\7-Zip\7z.exe a -m0=lzma2 -mmt6 -t7z -mx=9 -p%var_7zip_password% %var_dump_directory%\expdp.dmp.7z %var_dump_directory%\expdp.dmp <8> When Windows batch scripts running a .SQL file, an "exit" is needed within the .SQL file. Otherwise, the process will be hung. <9> Fetching second column from one batch command output: | |__ CMD> for /F "tokens=1,2,3,4,5" %%A in ('"tasklist | find "oraagent.exe""') DO ( taskkill /f /pid %%B > %var_logName% )
Your Comments