Batch Script To Delete Folders With Specific Names On All Drives
Introduction
In this comprehensive guide, we will explore how to create a batch script to delete folders with specific names, either containing "foo" or "bar", on all drives of your system. This task is particularly useful for cleaning up directories or removing unwanted folders that match a certain naming pattern. The script will focus on deleting folders only at the first level below the drive letter, such as F:\this folder's name
, ensuring that deeper nested directories are not affected. This approach provides a targeted solution, minimizing the risk of accidental data loss. We will break down the script step by step, explaining each command and its function, to give you a clear understanding of the process.
Understanding the Task
The primary objective is to develop a batch script that scans all available drives on your system and identifies folders in the root directory of each drive that contain either "foo" or "bar" in their names. Once these folders are identified, the script will proceed to delete them. To achieve this, we'll use a combination of commands such as for
, wmic
, if
, and rd
(remove directory). The for
command will iterate through each drive, wmic
will list the drives, if
will check the folder names, and rd
will delete the folders. By focusing on the first folder level, we avoid unintentionally deleting important directories nested deeper within the file structure. This method ensures that only the targeted folders are removed, maintaining the integrity of the rest of your file system.
Crafting the Batch Script
Step-by-Step Breakdown
To begin, let’s dissect the batch script into manageable segments, detailing each command's role and contribution to the overall functionality.
@echo off
for /f "tokens=2 delims==" %%a in ('wmic logicaldisk get caption /value') do (
for /d %%b in ("%%a*") do (
echo Processing folder: %%b
if not "%%b"=="C:\Windows" (
echo Folder is not Windows Directory
echo Checking folder name
echo %%b | find /i "foo" > nul
if not errorlevel 1 (
echo Folder contains foo - Deleting...
rd /s /q "%%b"
) else (
echo %%b | find /i "bar" > nul
if not errorlevel 1 (
echo Folder contains bar - Deleting...
rd /s /q "%%b"
) else (
echo Folder does not match deletion criteria
)
)
) else (
echo Folder is Windows Directory - Skipping...
)
)
)
pause
@echo off
: This command disables the echoing of commands to the console, providing a cleaner output.- The outer
for
loop useswmic
to retrieve the drive letters.wmic logicaldisk get caption /value
fetches the drive captions, and thefor /f
loop parses the output, extracting the drive letters. Thetokens=2 delims==
part specifies that we want the second token (the drive letter) after splitting the string by the=
delimiter. - The **_inner
for
loop** uses
for /dto iterate through the directories in the root of each drive.
%%b` represents each directory found. echo Processing folder: %%b
: This line displays the folder being processed in the console.if not "%%b"=="C:\Windows"
: This condition checks if the folder being processed is the Windows directory. Deleting the Windows directory can cause system instability, so we explicitly exclude it.echo Folder is not Windows Directory
: If the folder is not the Windows directory, this message is displayed.echo Checking folder name
: Indicates that the script is now checking the folder name for the specified criteria.echo %%b | find /i "foo" > nul
: This command pipes the folder name to thefind
command, which searches for the string "foo" (case-insensitive due to the/i
flag). The> nul
redirects the output, so it doesn't clutter the console.if not errorlevel 1
: This checks the exit code of thefind
command. Iferrorlevel
is not 1, it means "foo" was found in the folder name.echo Folder contains foo - Deleting...
: This message confirms that the folder contains "foo" and will be deleted.rd /s /q "%%b"
: This is the command that actually deletes the folder. The/s
switch deletes all subdirectories and files, and the/q
switch runs the deletion in quiet mode, without prompting for confirmation.else
: If "foo" was not found, the script proceeds to check for "bar" using a similarfind
command andif not errorlevel 1
condition.echo %%b | find /i "bar" > nul
: This command pipes the folder name to thefind
command, which searches for the string "bar" (case-insensitive due to the/i
flag). The> nul
redirects the output, so it doesn't clutter the console.if not errorlevel 1
: This checks the exit code of thefind
command. Iferrorlevel
is not 1, it means "bar" was found in the folder name.echo Folder contains bar - Deleting...
: This message confirms that the folder contains "bar" and will be deleted.rd /s /q "%%b"
: This is the command that actually deletes the folder. The/s
switch deletes all subdirectories and files, and the/q
switch runs the deletion in quiet mode, without prompting for confirmation.pause
: This command keeps the console window open after the script finishes, allowing you to see the output.
Detailed Explanation of Commands
@echo off
: This command is fundamental in batch scripting. By default, every command executed in a batch script is displayed in the console. While this can be useful for debugging, it often makes the output cluttered and hard to read.@echo off
suppresses this display, ensuring that only the messages explicitly echoed by the script (e.g., viaecho
) are visible. This leads to a cleaner and more user-friendly output.- `for /f