CMD shell:PATH分成几行

时间:2015-07-04 22:15:48

标签: windows cmd dos

我在几个网页上找到了将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?

1 个答案:

答案 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命令链,而不是它们的执行。