Windows CMD shell:路径拆分为多行

Windows CMD shell:路径拆分为多行,windows,cmd,dos,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.% 有人能解释一下为什么(1)不起作用,以及(2)

我在几个网页上发现了将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.%
有人能解释一下为什么(1)不起作用,以及(2)、(3)和(4)是如何起作用的吗
还有,有没有一种方法可以使用类似bash的变量语义——我的意思是,使用enabledayedexpansion?

1
for/f
在一组行上迭代。它可以将行拆分为标记,但不能对它们进行迭代

23-变量中的每个分号都替换为带引号的分隔符(在2中为空格,在3中为新分号),变量用引号括起来,因此在最后我们有

path       dir1;dir2;dir3
quoted    "dir1;dir2;dir3"
replacement
case 2 - "dir1" "dir2" "dir3"
case 3 - "dir1";"dir2";"dir3"
               ^ See here the replacement
然后使用
for
命令来迭代带引号元素的分隔(由空格或分号)列表

4这里使用解析器。行被解析,然后执行。在分析时,
路径
变量中的每个分号都被替换为
&echo.
,即,一个命令串联和一个新的
echo
命令。因此,效果是当读取该行时,它被处理为

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
延迟扩展激活时

1也不起作用,它也有同样的问题

23应该工作相同。唯一的“问题”是
setlocalenabledelayedexpansion
对命令行(您在问题中使用的内容)没有影响。您需要使用批处理文件或启动单独的
cmd
实例,并激活延迟扩展

cmd /v /c"for %a in ("!path:;=";"!") do @echo %~a"
唯一的区别是,从批处理文件(而不是从命令行),解析
@echo%%~a
时,变量中现有的感叹词将丢失

4将不起作用。它使用解析器在处理命令行进行命令处理之前进行常规变量扩展这一事实。这样,当分析命令时,可以找到完整的
echo
命令链


但是使用延迟扩展语法,扩展是在解析命令之后完成的,并且将回显到控制台的是
echo
命令链,而不是它们的执行。

No.1。不起作用,因为它只分离第一个定界符的左侧部分
第二。之所以有效,是因为它使用了替换,而且对于命令来说,它看起来像是单独的关键字。但是,您无法在输出中去掉引号
No 3与No 2基本相同,只是它去掉了引号
No 4非常酷,因为它基本上用echo命令替换了任何分号,因此实际上可以得到n个单独的echo命令,每个命令都有不同的路径部分