2016-08-12 76 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