Batch script cheat sheet

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

Header comment

1
2
3
4
5
6
7
8
9
:: 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.


1
rem This is a comment

Comments: A single line comment starts with rem.


1
2
3
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.


1
title My Terminal

Change the window title: Allows changing the title of the terminal window.


1
cls

Clear the screen: This command clears all output from the terminal window.


1
2
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

1
2
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%.


1
cd /D "%USERPROFILE%\Desktop"

Change working directory: Use the /D flag to make sure the working drive is also changed.


1
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.


1
2
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.


1
2
3
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 in the range you want.


1
2
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.


1
2
3
4
5
6
7
8
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 variable inside the loop.

See here for more for loop options.


1
2
3
4
5
6
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.

1
2
set var=One two three two six
echo %var:two=four%
1
2
3
4
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.


1
2
3
4
5
6
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

1
2
3
4
5
6
7
8
9
10
11
12
13
rem Call add function, print the result
call :AddFunction 12, 24
echo 12 + 24 = %ReturnValue%

rem Make sure flow never reaches beyond this point.
exit /B 0


rem This function adds the first and second param
rem together, and returns 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.


1
pause

Pause: This will pause execution and ask the user to “Press any key to continue…”


1
2
3
4
5
6
: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.


1
2
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).


1
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.


1
2
3
4
5
: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!


1
2
3
4
5
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.


1
2
3
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.


1
2
3
4
5
6
7
8
9
10
11
12
13
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.


1
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.


1
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.


1
2
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.

  • Copyrights © 2015-2021 jjv360

请我喝杯咖啡吧~

支付宝
微信