我在几个网页上找到了将Windows%PATH变量拆分为多行的不同方法:
1. for /f "delims=;" %a in ("%path%") do echo %a . . . (doesn't work)
2. for %G in ("%Path:;=" "%") do @echo %G
3. for %a in ("%Path:;=";"%") do @echo %~a
4. ECHO.%PATH:;= & ECHO.%
有人可以解释一下why (1) doesn't work, and how (2), (3) and (4) do
吗?
并且,有没有办法用类似bash的变量语义来实现它 - 我的意思是,使用ENABLEDELAYEDEXPANSION?
答案 0 :(得分:1)
1 app2.directive()
遍历一组行。它可以将行拆分为令牌,但不会迭代它们
2 和 3 - 变量中的每个分号都替换为带引号的分隔符(在 2 中,它是一个空格,在 3 一个新的分号)和变量用引号括起来,所以最后我们有
for /f
然后使用path dir1;dir2;dir3
quoted "dir1;dir2;dir3"
replacement
case 2 - "dir1" "dir2" "dir3"
case 3 - "dir1";"dir2";"dir3"
^ See here the replacement
命令迭代引用元素的分隔(按空格或分号)列表
4 这里使用了解析器。解析然后执行行。在解析时,for
变量中的每个分号都替换为path
,即命令串联和新的& echo.
命令。因此,效果是当线被引用时,它被处理为
echo
延迟扩展有效,
1 也行不通,它有同样的问题。
2 和 3 应该一样。唯一的问题"是Read line
echo %path:;= &echo.%
v..............v Variable expanded
dir1;dir2;dir3 = dir1 & echo.dir2 & echo.dir3
Final command after parser work
echo dir1 &echo.dir2 &echo.dir3
^ .........^... echo commands included in line at parse time
对命令行没有影响(你在问题中使用的是什么)。您将需要使用批处理文件或启动具有延迟扩展活动
setlocal enabledelayedexpansion
实例
cmd
唯一的区别是,从批处理文件(而不是命令行)中,当解析cmd /v /c"for %a in ("!path:;=";"!") do @echo %~a"
时,变量中的现有感叹号将会丢失。
4 无效。它使用以下事实:解析器在处理命令行之前执行常规变量扩展以进行命令处理。这样,当分析命令时,可以找到完整的@echo %%~a
命令链。
但是使用延迟扩展语法,扩展是在解析命令之后完成的,并且将回显到控制台的是echo
命令链,而不是它们的执行。