3 回答

TA貢獻1821條經驗 獲得超5個贊
簡單的方法是使用
for %a in ("%path:;=";"%") do @echo %~a
這適用于沒有;在路徑中的所有人,沒有"圍繞單個元素
測試路徑= C:\ qt \ 4.6.3 \ bin; C:\ Program Files; C:\ documents&Settings
但是“始終”的解決方案有點復雜
EDIT:現在是一個有效的變體
@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
)
那我在那做什么?
我試圖解決主要問題:引號內的分號應該被忽略,只有正常的分號應該被替換為";"
我使用批量解釋器本身來解決這個問題。
首先,我必須使字符串安全,逃避所有特殊字符。
然后全部;被替換^;^;
然后技巧從線開始
set var=%var:"=""%"(缺少的引用是關鍵?。?/p>
這擴展的方式使得所有轉義字符都將丟失它們的轉義符號:
var=foo & bar;;baz<>gak;;"semi^;^;colons^;^;^&embedded";;foo again!;;...
但僅在引號之外,所以現在引號;;和內部之間的分號之間存在差異^;^;。
這是關鍵。

TA貢獻1900條經驗 獲得超5個贊
一個簡單的襯墊,可以打印PATH
環境變量:
ECHO.%PATH:;= & ECHO.%
如果你的PATH
等于A;B;C
上面的字符串替換將改變ECHO.A & ECHO.B & ECHO.C
它并一次性執行它。完全停止可防止出現“ECHO is on”消息。
- 3 回答
- 0 關注
- 661 瀏覽
添加回答
舉報