Batch scripts are possibly the most complicated and difficult things to create. So here's a small collection of snippets that I've used before, hopefully this can help someone else too.
Neatness
:: Name Random file picker :: Purpose Open a random file in this directory. :: Author jjv360 :: Revision 5 January 2020 - Initial version 12 March 2020 - Whitespace fix @echo off setlocal EnableDelayedExpansion title Random file picker
Header comment: Comments can also start with ::
, which is useful for creating nice headers. They cause problems inside blocks though, so best not to use them anywhere else.
echo off
is also a good thing to have at the start of your script, it prevents each line from being printed out during execution. Putting @
in front of a line prevents that line from being printed out as well.
Enabling delayed expansion is also a very useful thing to have, and using setlocal
will ensure any variables you change will not be persisted when the script ends.
rem This is a comment
Comments: A single line comment starts with rem
.
echo off echo. echo Hello world!
Writing text out: Anything after echo
is printed to the screen, except for echo off
which disables command echoing, and echo.
which prints a blank line.
title My Terminal
Change the window title: Allows changing the title of the terminal window.
cls
Clear the screen: This command clears all output from the terminal window.
color 02 echo This text is green!
Set text color: Use the color
command to set the background and foreground color of any future printed text. See here for a list of colors.
Variables
set Name=Josh echo Hello, %Name%.
Create and use variables: You can create variables with the set
command. Note, lack of spaces around the =
is important.
You can use variables anywhere by using the format %MyVariableName%
.
cd /D "%USERPROFILE%\Desktop"
Change working directory: Use the /D
flag to make sure the working drive is also changed.
setlocal EnableDelayedExpansion
Allow variables inside loops: In any code block like FOR ... DO ( ... )
the entire block's variables are expanded only once. This means if you set a variable in there, you can't use it from inside the block.
Delayed expansion allows you to expand variables only when they're needed, by using !MyVar!
instead of %MyVar%
.
Note: Using setlocal
means when your script ends, all variables modified after that (including working directory changes) are not stored.
set /a Num=3 * 20 echo 3 * 20 = %Num%
Do maths: Using set /a
, you can do simple maths. Batch scripts are only capable of doing calculations using 32-bit integers.
rem Pick a number between 5 and 10 set /a Num=%random% %% 5 + 5 echo Picked number: %Num%
Random numbers: The built-in variable %random%
generates a random number between 0 and 32768 (exclusive) every time you use it.
You can also use some maths with the (escaped) modulus operator %%
to pick a random number of your choosing.
set /p Name="Enter your name: " echo Hello, %Name%
Ask for user input: You can use set /p
to ask the user to set a variable.
SET cmd="wmic ComputerSystem get name" FOR /F "skip=1" %%A IN ('%cmd%') DO ( set ComputerName=%%A goto leaveSystemName ) :leaveSystemName echo Computer name is %ComputerName%
Parsing output from commands: You can use a FOR /F
loop to process each line of output from a command.
You can also use a goto
to leave the loop early.
Remember to use setlocal EnableDelayedExpansion
if you need to set and use a variabe inside the loop.
See here for more for loop options.
set Txt=My long text string. echo Full string: %Txt% echo First 3 chars: %Txt:~0,3% echo Last 3 chars: %Txt:~-3% echo Chars 3 to 6: %Txt:~3,6% echo Chars 3 to last 3: %Txt:~3,-3%
Substrings: You can use substrings with the %VarName:~From,To%
format. Negative indexes can be used to get an index from the end of the string. If To
is missing, it takes until the end of the string.
set var=One two three two six echo %var:two=four% set var=One two three two six set vFind=two set vReplace=four echo %var:!vFind!=!vReplace!%
String substitution: You can use %Var:Find=Replace%
to replace all instances of a string with another string.
If you have EnableDelayedExpansion
on, you can use !var!
inside to replace a string with the contents of a variable.
echo Drive of the script file: %~d0 echo Folder of script: %~dp0 echo Full path to script: %~dpnx0 echo First argument: %1 echo Second argument: %2 echo All arguments: %*
Command line arguments: You can use %1
, %2
, etc to read arguments provided to the script. You can also use %0
and modifiers to get the location of the current script file.
Code flow
rem Call add function, print the result call :AddFunction 12, 24 echo 12 + 24 = %ReturnValue% rem Make sure flow never reaches beyond rem this point. exit /B 0 rem This function adds the first and rem second param together, and returns rem the result in %ReturnValue%. :AddFunction set /a ReturnValue=%~1 + %~2 exit /B 0
Local functions: It's possible to create functions inside a single batch script. Call functions with call :LabelName Param1, Param2, ...
.
Since all variables are shared, the function can set a variable named for example ReturnValue
to return a result.
Parameters are available inside the function with %~1
, %~2
etc.
Use exit /B [ErrorLevel]
to exit a function. You should also usually put all your functions at the end of the script, and make sure flow never reaches them by putting an exit /B 0
at the end of your "main" code.
pause
Pause: This will pause execution and ask the user to "Press any key to continue…"
:choice set /p Answer=Choose 1 or 2: if "%Answer%"=="1" goto run if "%Answer%"=="2" goto exit echo Please enter the correct choice. goto choice
Conditional check: You can use an if
check to run some code under certain conditions only. See here for more examples, including checking if variables are defined or if files exist.
rem Check if internet is up ping google.com -n 1 >NUL 2>&1 && echo ONLINE || echo OFFLINE
Chain commands based on exit code: You can use &&
and ||
to chain commands together. Commands are executed left-to-right. &&
executes the right-hand side only if the left hand side returned success (exit code 0), and ||
is the opposite, it only executes the right hand side if the left hand side failed (non-zero exit code).
adb connect 10.0.0.1:5555 || exit /B 1
Exit on error: You can use the exit
command chained with ||
to stop execution of your script when a command fails.
:startloop set /p Ans=Should I stop? (y/n) if /I "%Ans%"=="y" goto :endloop goto :startloop :endloop
While loops: You can simulate a while loop using labels and goto
. Remember to make sure your label names are unique within the script!
rem Loop through items separated by space for %%x in (one two three) do ( echo %%x ) rem Loop 1 through 10. Format is (start, step, end) for /L %%x in (1, 1, 10) do ( echo %%x )
For loops: You can iterate through a sequence of items or a range with for
. There are all sorts of ways to use this command, including looping through files, directories, command output, etc.
for /F "delims=" %%a in (file.txt) do ( echo %%a )
Read a file line by line: You can pass delims=
to for /F
in order to read each line as a whole.
goto :Action2 :Action1 echo 1 :Action2 echo 2 goto :eof :Action3 echo 3 rem This outputs 2 only
Jump around with labels: You can mark a point in the script with a :label
, and then jump to that point with goto :label
.
There is also the built-in label :eof
which jumps to the end of the script.
ping localhost -n 2 >NUL 2>&1
Fake sleep: Windows doesn't seem to have a built-in sleep function, but you can fake it with ping
. You can specify the amount of seconds with -n
. Only use 2 or more seconds.
if exist "%~dp0/file.txt" ( echo YES ) else ( echo NO )
Check if file exists: You can also use %~dp0
to get a relative path to the current script, even if the current working directory is somewhere else.
rmdir temp >NUL 2>&1 ping google.com >"%USERPROFILE%\ping.txt" 2>&1
Redirect output text or hide it: You can redirect the output from a command with >
. You can specify a file name, or NUL
to discard the output. You can also put 2>&1
afterwards if you want to redirect the error output as well.
NICE BLOG KEEP UP THE EPIC WORK MAN LOVE IT