Batch script examples

Last updated on Jul 3, 2021

Check the following batch script examples to learn how to fully automate typical defragmentation tasks using UltraDefrag CLI.

Default custom script for the automatic defragmentation

UltraDefrag uses the following custom script for the automatic defragmentation by default:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@echo off
::
:: UltraDefrag - a powerful disk defragmenter for Windows.
::
:: auto-defrag-custom.cmd - custom script for automatic defragmentation.
::
:: Visit https://en.wikibooks.org/wiki/Windows_Batch_Scripting
:: for general information about the script syntax.
::
:: Refer to the Console chapter of the UltraDefrag Handbook for detailed
:: information about the `udefrag` command and environment variables
:: controlling its behaviour. You should have received the handbook
:: along with this program, if not, you can find it at the official
:: UltraDefrag website (https://ultradefrag.net/)
::
:: To use Unicode characters in filters edit this file in the Notepad++
:: editor and then save it in UTF-8 (without BOM) encoding.
::
:: Also Notepad++ features syntax highlighting which makes it much easier
:: to edit the file. The latest version of Notepad++ can be downloaded
:: for free from http://www.notepad-plus-plus.org/
::
:: Below is a sample script. It defragments system drive and heavily
:: fragmented content on all the connected non-removable drives.
:: Feel free to adjust it to make it more suitable for your needs,
:: replace it entirely or keep as is.

:: first of all, let's set UD_EX_FILTER to exclude all

:: the stuff which rarely benefits from defragmentation

:: exclude temporary content

set UD_EX_FILTER=*system volume information*;*temp*;*tmp*;*recycle*
set UD_EX_FILTER=%UD_EX_FILTER%;*dllcache*;*ServicePackFiles*;*.log
set UD_EX_FILTER=%UD_EX_FILTER%;*Windows.old*

:: exclude archives

set ARCHIVE_PATTERNS=*.7z;*.7z.*;*.arj;*.bkf;*.bz2;*.bzip2;*.cab;*.cpio;*.deb
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.dmg;*.gz;*.gzip;*.lha;*.lzh;*.lzma
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.rar;*.rpm;*.swm;*.tar;*.taz;*.tbz
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.tbz2;*.tgz;*.tpz;*.txz;*.xar;*.xz
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.z;*.zip
set UD_EX_FILTER=%UD_EX_FILTER%;%ARCHIVE_PATTERNS%

:: exclude multimedia content

set AUDIO_PATTERNS=*.aif;*.cda;*.flac;*.iff;*.kpl;*.m3u;*.m4a;*.mid
set AUDIO_PATTERNS=%AUDIO_PATTERNS%;*.mp3;*.mpa;*.ra;*.wav;*.wma
set VIDEO_PATTERNS=*.3g2;*.3gp;*.asf;*.asx;*.avi;*.flv;*.mov;*.mp4
set VIDEO_PATTERNS=%VIDEO_PATTERNS%;*.mpg;*.rm;*.srt;*.swf;*.vob;*.wmv
set UD_EX_FILTER=%UD_EX_FILTER%;%AUDIO_PATTERNS%;%VIDEO_PATTERNS%

:: exclude virtual machines

set DISK_IMAGE_PATTERNS=*.fat;*.hdd;*.hfs;*.img;*.iso;*.ntfs;*.squashfs
set DISK_IMAGE_PATTERNS=%DISK_IMAGE_PATTERNS%;*.vdi;*.vhd;*.vmdk;*.wim
set UD_EX_FILTER=%UD_EX_FILTER%;%DISK_IMAGE_PATTERNS%

:: exclude big fragments which rarely benefit from defragmentation

set UD_FRAGMENT_SIZE_THRESHOLD=20MB

:: if your system drive is an SSD uncomment the following

:: line to exclude slightly fragmented content as well
:: set UD_FRAGMENTS_THRESHOLD=20

:: uncomment the following line to increase amount of debugging output

:: set UD_DBGPRINT_LEVEL=DETAILED

:: defragment system drive

set UD_LOG_FILE_PATH=%UD_INSTALL_DIR%\logs\autodefrag-system.log
udefrag --wait %SystemDrive%

:: defragment heavily fragmented content

:: on all the connected non-removable drives
set UD_LOG_FILE_PATH=%UD_INSTALL_DIR%\logs\autodefrag-fixed.log
set UD_FRAGMENTS_THRESHOLD=20
udefrag --wait --all-fixed

Checking all the available disks for errors

If the disks you want to defragment have not been checked for errors for a long time, it’s a good idea to check them all using the system chkdsk utility before performing defragmentation.

Feel free to use the following script to fully automate the process:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@echo off
::
:: This script defragments all the available non-removable disks.
:: If some disks have errors the script repairs them first. If it
:: is impossible to repair a disk because it is in use, the script
:: schedules the repair for the next system reboot and skips the disk.
::

:: set the UltraDefrag specific environment

:: variables according to the user preferences
call "%UD_INSTALL_DIR%\setenv.cmd"

:: defragment the disks

for /f "skip=7 tokens=1" %%d in ('udefrag -l') do call :defragment %%d

:: clear the environment variables and exit

call "%UD_INSTALL_DIR%\clearenv.cmd"
exit /B 0

::

:: This procedure defragments a single disk.
::
:: Usage:
::
::   call :defragment <drive_letter>
::
:defragment
    echo Preparing to check the disk %1 for errors...
    echo.
    chkdsk %1
    echo.
   
    :: if the disk has errors, try to repair it

    if "%ERRORLEVEL%" equ "3" (
        echo y | chkdsk /f %1
        echo.
    )
   
    :: if the disk had no errors or the repair

    :: was successful, defragment the disk
    if "%ERRORLEVEL%" neq "3" (
        echo Preparing to defragment the disk %1...
        echo.
        udefrag %1
        echo.
    )
exit /B 0

Complete defragmentation of all the available disks

It can be tedious to check manually whether you have some locked fragmented files on your disks or not and perform the boot time defragmentation in case they are present.

You can use the following script to fully automate the process. Additionally, the script performs regular defragmentation of the disks and optimizes the master file tables in case they need optimization:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
@echo off
::
:: This script performs complete defragmentation
:: of all the available non-removable disks.
::

:: set the UltraDefrag specific environment

:: variables according to the user preferences
call "%UD_INSTALL_DIR%\setenv.cmd"

:: perform regular defragmentation of the disks

for /f "skip=7 tokens=1" %%d in ('udefrag -l') do call :defragment %%d

:: optimize master file tables

if "%MFT_OPT_DISKS%" neq "" (
    echo Preparing to optimize the master file tables on %MFT_OPT_DISKS%...
    echo.
    udefrag --optimize-mft %MFT_OPT_DISKS%
    echo.
)

:: enqueue defragmentation of locked files (they will be defragmented using

:: the boot time interface of UltraDefrag at the next system reboot)
if "%BT_DEFRAG_DISKS%" neq "" (
    echo Enqueuing the boot time defragmentation of %BT_DEFRAG_DISKS%...
    echo.
    call "%UD_INSTALL_DIR%\bt.cmd" /E udefrag %BT_DEFRAG_DISKS%
)

:: clear the environment variables used above and exit

call "%UD_INSTALL_DIR%\clearenv.cmd"
set MFT_OPT_DISKS=
set BT_DEFRAG_DISKS=
exit /B 0

::

:: This procedure defragments a single disk.
::
:: Usage:
::
::   call :defragment <drive_letter>
::
:defragment
    echo Preparing to defragment disk %1...
    echo.
   
    :: defragment the disk

    udefrag %1 || exit /B 1
    echo.
   
    :: check the file fragmentation report

    for /f "eol=; tokens=5,6 usebackq" %%a in (`call "%UD_INSTALL_DIR%\show-report.cmd" %1`) do (
        if /i "%%a" equ "locked" set LOCKED_FILES_ARE_FRAGMENTED=1
        if /i "%%b" equ "%1\$MFT" set MFT_IS_FRAGMENTED=1
    )

    :: if the $MFT file is fragmented, enqueue the disk for the MFT optimization

    if "%MFT_IS_FRAGMENTED%" equ "1" set MFT_OPT_DISKS=%MFT_OPT_DISKS% %1
   
    :: if locked files are fragmented, enqueue the disk for the boot time defragmentation

    if "%LOCKED_FILES_ARE_FRAGMENTED%" equ "1" set BT_DEFRAG_DISKS=%BT_DEFRAG_DISKS% %1
   
    :: clear the environment variables used above

    set MFT_IS_FRAGMENTED=
    set LOCKED_FILES_ARE_FRAGMENTED=
exit /B 0

Exclusion of files from defragmentation

Temporary files, archives and multimedia files usually do not affect system performance and thus should be excluded from defragmentation to shorten the disk processing time.

The easiest way to do it is to set the exclusions using the preferences dialog of the graphical interface and then use the setenv command to set the command line environment according to the user preferences, as shown in the examples above.

Alternatively, you can set the exclusions using the UD_EX_FILTER environment variable. Check the following script to learn how to do it. Also the script excludes big fragments as usually they do not affect system performance as well.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@echo off
::
:: This script excludes temporary files, archives,
:: multimedia files and big fragments from defragmentation
:: and then defragments all the available non-removable disks.
::

:: exclude temporary files

set UD_EX_FILTER=*system volume information*;*temp*;*tmp*;*recycle*
set UD_EX_FILTER=%UD_EX_FILTER%;*dllcache*;*ServicePackFiles*;*.log
set UD_EX_FILTER=%UD_EX_FILTER%;*Windows.old*

:: exclude archives

set ARCHIVE_PATTERNS=*.7z;*.7z.*;*.arj;*.bkf;*.bz2;*.bzip2;*.cab;*.cpio;*.deb
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.dmg;*.gz;*.gzip;*.lha;*.lzh;*.lzma
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.rar;*.rpm;*.swm;*.tar;*.taz;*.tbz
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.tbz2;*.tgz;*.tpz;*.txz;*.xar;*.xz
set ARCHIVE_PATTERNS=%ARCHIVE_PATTERNS%;*.z;*.zip
set UD_EX_FILTER=%UD_EX_FILTER%;%ARCHIVE_PATTERNS%

:: exclude multimedia files

set AUDIO_PATTERNS=*.aif;*.cda;*.flac;*.iff;*.kpl;*.m3u;*.m4a;*.mid
set AUDIO_PATTERNS=%AUDIO_PATTERNS%;*.mp3;*.mpa;*.ra;*.wav;*.wma
set VIDEO_PATTERNS=*.3g2;*.3gp;*.asf;*.asx;*.avi;*.flv;*.mov;*.mp4
set VIDEO_PATTERNS=%VIDEO_PATTERNS%;*.mpg;*.rm;*.srt;*.swf;*.vob;*.wmv
set UD_EX_FILTER=%UD_EX_FILTER%;%AUDIO_PATTERNS%;%VIDEO_PATTERNS%

:: exclude big fragments

set UD_FRAGMENT_SIZE_THRESHOLD=20MB

:: defragment all the available non-removable disks

udefrag --all-fixed

Exclusion of disks from defragmentation

If you want to exclude certain disks from defragmentation, you can easily do it using the UD_EX_FILTER environment variable:

1
2
3
4
5
6
7
8
9
10
11
@echo off
::
:: This script defragments all the available
:: non-removable disks except the disk C:
::

call "%UD_INSTALL_DIR%\setenv.cmd"

set UD_EX_FILTER=%UD_EX_FILTER%;C:\*

udefrag --all-fixed

Also you can easily exclude disks having certain fragmentation level:

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
::
:: This script performs the full optimization
:: of all the available non-removable disks
:: having fragmentation level above 20%.
::

call "%UD_INSTALL_DIR%\setenv.cmd"

set UD_FRAGMENTATION_THRESHOLD=20

udefrag -o --all-fixed

Defragmentation of disks having no drive letters assigned

If you want to defragment disks which have no drive letters assigned, you can use the system diskpart utility to assign drive letters temporarily.

Check the following script to learn how to do it:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@echo off
::
:: This script defragments a disk with no drive
:: letter assigned, mounted to C:\Games.
::

set MOUNT_POINT=C:\Games

:: set the UltraDefrag specific environment

:: variables according to the user preferences
call "%UD_INSTALL_DIR%\setenv.cmd"

:: assign a drive letter to the disk

echo Preparing to assign a drive letter to the disk mounted at %MOUNT_POINT%...
echo.
echo select volume=%MOUNT_POINT% > diskpart.script
echo assign letter=t >> diskpart.script
diskpart /s diskpart.script || goto fail
echo.

:: give the diskpart utility 15 seconds to finish its job

timeout /t 15 /nobreak > nul

:: defragment the disk

echo Preparing to defragment the disk...
echo.
udefrag t: || set DEFRAG_FAILED=1
echo.

:: remove the assigned letter

echo Preparing to remove the assigned drive letter...
echo.
echo select volume=%MOUNT_POINT% > diskpart.script
echo remove letter=t >> diskpart.script
diskpart /s diskpart.script

:: give the diskpart utility 15 seconds to finish its job

timeout /t 15 /nobreak > nul

if "%DEFRAG_FAILED%" equ "1" goto fail

:success

del /q diskpart.script
call "%UD_INSTALL_DIR%\clearenv.cmd"
set MOUNT_POINT=
set DEFRAG_FAILED=
exit /B 0

:fail

del /q diskpart.script
call "%UD_INSTALL_DIR%\clearenv.cmd"
set MOUNT_POINT=
set DEFRAG_FAILED=
exit /B 1