Skip to main content

How to Trim Leading Spaces from a String in Batch Script

When processing user input or data from files, you often encounter strings with unwanted leading whitespace (spaces or tabs). This can cause string comparisons to fail and lead to formatting errors. While many languages have a built-in LTrim() function for this, batch scripting does not. However, you can achieve the same result perfectly using a clever and powerful feature of the FOR /F command.

This guide will teach you the standard, pure-batch method for stripping all leading spaces and tabs from a string. You will learn how the FOR /F command's parsing behavior makes this possible, how to create a reusable subroutine for clean code, and understand the limitations of this technique.

The Challenge: No Native LTrim() Function

The cmd.exe interpreter treats variables as simple strings of text. It has no built-in functions to manipulate them in complex ways like trimming whitespace. A command like SET MyVar=%MyVar% does nothing, and there's no syntax to automatically strip spaces. Therefore, we must use a command that can parse a string and intelligently discard leading whitespace.

The Core Method: The FOR /F Parsing Trick

The FOR /F command is designed to loop through and parse text. By default, it breaks lines into "tokens" using spaces and tabs as delimiters. A key part of its behavior is that it automatically ignores any leading delimiters.

This is the feature we can exploit. If we feed our string to FOR /F, it will naturally discard the leading spaces for us.

Syntax: FOR /F "tokens=*" %%A IN ("Your String") DO SET "Result=%%A"

  • "tokens=*": This option is crucial. It tells FOR /F to take all tokens it finds on the line and treat them as a single token, which is then assigned to the %%A variable.
  • %%A: This will hold the entire string after the leading spaces have been stripped.

Example Script: A Basic Leading Space Trim

This script demonstrates the core logic on a string with several leading spaces.

@ECHO OFF
SET "MyString= Hello World with leading spaces."

ECHO Original string: "[%MyString%]"

REM Use the FOR /F trick to trim the string.
FOR /F "tokens=*" %%A IN ("%MyString%") DO (
SET "TrimmedString=%%A"
)

ECHO Trimmed string: "[%TrimmedString%]"

Output:

Original string: "[   Hello World with leading spaces.]"
Trimmed string: "[Hello World with leading spaces.]"

The leading spaces are gone, but any trailing spaces would remain.

How the Script Works

Let's break down the key command: FOR /F "tokens=*" %%A IN ("%MyString%") DO ...

  1. The FOR /F loop receives the string " Hello World...".
  2. Its internal parser starts reading the string. By default, its delimiters are the space and tab characters.
  3. It encounters the first three characters, sees they are delimiters, and discards them.
  4. It then finds the character H, which is the beginning of the first real token.
  5. The tokens=* option tells the parser: "From this point on, capture everything you see for the rest of the line and assign it to a single variable (%%A)."
  6. The parser grabs Hello World with leading spaces. and assigns it to %%A.
  7. The loop finishes its first (and only) iteration, and the SET "TrimmedString=%%A" command saves the result.

Making it Reusable: A "TrimLeading" Subroutine

This logic is perfect for a reusable subroutine that you can call from anywhere in your script.

@ECHO OFF
SETLOCAL

SET "MyVar= Some indented text"
ECHO Before: "[%MyVar%]"

CALL :TrimLeading MyVar

ECHO After: "[%MyVar%]"
GOTO :EOF


:TrimLeading
REM Subroutine to trim leading spaces and tabs from a variable.
REM Usage: CALL :TrimLeading VariableName
FOR /F "tokens=*" %%A IN ("!%1!") DO SET "TrimmedValue=%%A"
SET "%1=%TrimmedValue%"
GOTO :EOF
note

This simplified subroutine requires DelayedExpansion to be enabled (!%1!) to work robustly with variables containing special characters.

Common Pitfalls and How to Solve Them

  • Trailing Spaces: This method does not trim trailing spaces. If MyString is " Hello World ", the result will be "Hello World ". Trimming trailing spaces requires a different, more complex FOR loop.
  • Empty or Whitespace-Only Strings: If your string is completely empty ("") or contains only spaces (" "), the FOR /F loop will find no tokens and will not execute its body. This means your result variable will not be set.
    • Solution: Always initialize your result variable to an empty string before the loop (SET "TrimmedString="). This ensures it is clean if the loop doesn't run.
  • Special Characters (&, |, ^): If your string contains special command characters, you should use delayed expansion to pass it to the FOR /F loop safely.
    • Solution: FOR /F "tokens=*" %%A IN ("!MyString!") DO ...

Practical Example: Cleaning User Input

This script prompts a user for input and cleans it up before using it, ensuring that accidental leading spaces don't cause logical errors.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:GetInput
SET "UserInput="
SET /P "UserInput=Enter the command (e.g., 'start'): "

ECHO You entered: "[!UserInput!]"

REM --- Trim the input using the FOR /F trick ---
SET "TrimmedInput="
FOR /F "tokens=*" %%A IN ("!UserInput!") DO (
SET "TrimmedInput=%%A"
)

ECHO Trimmed command: "[!TrimmedInput!]"
ECHO.

IF /I "!TrimmedInput!"=="start" (
ECHO OK, starting the process...
) ELSE (
ECHO Command not recognized. Please try again.
GOTO :GetInput
)

ENDLOCAL

Conclusion

The FOR /F command's default parsing behavior provides a clever, fast, and reliable method for trimming leading whitespace from a string in a batch script.

Key takeaways:

  • The core command is FOR /F "tokens=*" %%A IN ("%Var%") DO SET "Result=%%A".
  • This method naturally strips all leading spaces and tabs.
  • It does not affect trailing whitespace.
  • For robust scripting, especially when handling special characters, use delayed expansion: FOR /F ... IN ("!Var!").
  • Encapsulating this logic in a reusable subroutine is a highly recommended best practice.