3 回答
TA贡献1821条经验 获得超4个赞
简单的方法是使用
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:"=""%"(缺少的引用是关键!)。
这扩展的方式使得所有转义字符都将丢失它们的转义符号:
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 关注
- 630 浏览
添加回答
举报