2016-08-12 82 views
2

我的忠实路径遍历方法不再有效 - 它将空格视为分隔符。我需要进行批量编程已经有一段时间了。
使用FOR循环时,唯一允许分隔符的是FOR /F选项。
我不想创建一个包含路径的临时文件,希望做一些象下面这样:在Windows中使用FOR进行遍历路径变量

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. 
+0

的稍微改进版本请不要将您选择的解决方案插入到问题中!我做了[回滚](http://stackoverflow.com/revisions/38913232/4)。接受答案清楚地表明哪个解决方案对你最合适。谢谢! – aschipfl

回答

0

使用标准for循环而不是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 

这只有在案件没有被"包围的路径,其中没有包含;

2
@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 
1

一个完美的解决方案必须能够;分隔符,并引述;文字之间进行区分。

这里是一个非常强大的解决方案始终有效使用JREPL.BAT - a regular expression find/replace utility

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's original solution