'Pretty print' windows %PATH% variable - how to split on ';' in CMD shell

batch-file, cmd, path, windows

Solution

The simple way is to use

for %a in ("%path:;=";"%") do @echo %~a

This works for all without `;` in the path and without `"` around a single element Tested with path=C:\qt\4.6.3\bin;C:\Program Files;C:\documents & Settings

But a "always" solution is a bit complicated EDIT: Now a working variant

@echo off
setlocal DisableDelayedExpansion
set "var=foo & bar;baz<>gak;"semi;colons;^&embedded";foo again!;throw (in) some (parentheses);"unmatched ;-)";(too"

set "var=%var:"=""%"
set "var=%var:^=^^%"
set "var=%var:&=^&%"
set "var=%var:|=^|%"
set "var=%var:<=^<%"
set "var=%var:>=^>%"

set "var=%var:;=^;^;%"
rem ** This is the key line, the missing quote is intended
set var=%var:""="%
set "var=%var:"=""%"

set "var=%var:;;="";""%"
set "var=%var:^;^;=;%"
set "var=%var:""="%"
set "var=%var:"=""%"
set "var=%var:"";""=";"%"
set "var=%var:"""="%"

setlocal EnableDelayedExpansion
for %%a in ("!var!") do (
    endlocal
    echo %%~a
    setlocal EnableDelayedExpansion
)

What did I do there? I tried to solve the main problem: that the semicolons inside of quotes should be ignored, and only the normal semicolons should be replaced with `";"`

I used the batch interpreter itself to solve this for me.

- First I have to make the string safe, escaping all special characters.

- Then all `;` are replaced with `^;^;`

- and then the trick begins with the line `set var=%var:"=""%"` (The missing quote is the key!). This expands in a way such that all escaped characters will lose their escape caret: `var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;`... But only outside of the quotes, so now there is a difference between semicolons outside of quotes `;;` and inside `^;^;`. Thats the key.

Problem

I want to run a simple one-liner in the Windows CMD prompt to print my `%PATH%` variable, one entry per line. I tried this: `for /f "delims=;" %a in ("%path%") do echo %a` but this only prints the first entry: ``` Z:\>for /f "delims=;" %a in ("%path%") do echo %a Z:\>echo c:\python25\. c:\python25\. ``` Also as you can see from the output above, this is also printing the `echo %a` command as well as the output. Is there any way to stop this? If I try a similar command, I get all the entries, but still get the `echo %a` output spamming the results. I don't understand why the following prints all entries, but my attempt on `%PATH%` doesn't. I suspect I don't understand the `/F` switch. ``` Z:\>for %a in (1 2 3) do echo %a Z:\>echo 1 1 Z:\>echo 2 2 Z:\>echo 3 3 ```

Original source

Related problems