在Windows中使用FOR遍历pathvariables

我忠实的path遍历方法不再有效 – 它将空格视为分隔符。 我需要批量编程已经有一段时间了。
使用FOR循环时,唯一允许分隔符的是FOR /F选项。
我不想创build一个包含path的临时文件,希望能做到如下所示:

 C:\Users>for /f "delims=;" %i in %path% do echo %i C:\Program was unexpected at this time. C:\Users>for /f "delims=;" %i in (%path%) do echo %i \Common was unexpected at this time. C:\Users>for /f "delims=;" %i in 'foo;bar' do echo %i 'foo was unexpected at this time. 

使用循环标准而不是for /F "delims=;" 用一些聪明的子串替换:

 for %I in ("%PATH:;=";"%") do @echo %~I 

假设PATH包含C:\Program Files\someapp1\app1.exe;C:\Program Files\someapp2\app2.exe;C:\Program Files\someapp3\app3.exe ,您将收到以下输出:

 C:\Program Files\someapp1\app1.exe C:\Program Files\someapp2\app2.exe C:\Program Files\someapp3\app3.exe 

这只有在路径没有被"包围"情况下才有效。

 @echo off setlocal EnableDelayedExpansion for /F "delims=" %%a in (^"!path:^;^=^ % Do NOT remove this line % !^") do echo %%a 

输出示例:

 C:\Program Files (x86)\AMD APP\bin\x86_64 C:\Program Files (x86)\AMD APP\bin\x86 C:\Windows\system32 C:\Windows C:\Windows\System32\Wbem C:\Windows\System32\WindowsPowerShell\v1.0\ C:\Program Files (x86)\Windows Live\Shared C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static C:\Program Files\Bandizip\7z 

一个完美的解决方案必须能够区分; 分隔符和引用; 文字。

这是一个非常强大的解决方案,总是使用JREPL.BAT – 正则表达式查找/替换工具

 for /f "eol=: delims=" %%F in ( 'jrepl "([^;\q]+|\q.*?(\q|$))+" $0 /x /jmatch /s path' ) do echo(%%F 

如果你想要做的是列出每个文件夹,每个文件夹一行,那么只需删除FOR / F循环

 call jrepl "([^;\q]+|\q.*?(\q|$))+" $0 /x /jmatch /s path 

如果您想要一个始终有效的纯批处理解决方案,那么您可以使用:

 @echo off setlocal DisableDelayedExpansion set "var=%var:"=""%" set "var=%var:^=^^%" set "var=%var:&=^&%" set "var=%var:|=^|%" set "var=%var:<=^<%" set "var=%var:>=^>%" set "var=%var:;=^;^;%" set var=%var:""="% set "var=%var:"=""Q%" set "var=%var:;;="S"S%" set "var=%var:^;^;=;%" set "var=%var:""="%" setlocal EnableDelayedExpansion set "var=!var:"Q=!" for %%a in ("!var:"S"S=";"!") do ( if "!!"=="" endlocal if %%a neq "" echo %%~a ) 

以上是jeb原始解决方案的稍微改进的版本