小编典典

Pretty print' windows %PATH% 变量 - 如何在 ';' 上拆分 在 CMD 外壳中

all

我想在 Windows CMD 提示符下运行一个简单的单行来打印我的%PATH%变量,每行一个条目。

我试过这个:for /f "delims=;" %a in ("%path%") do echo %a但这只会打印第一个条目:

Z:\>for /f "delims=;" %a in ("%path%") do echo %a

Z:\>echo c:\python25\.
c:\python25\.

从上面的输出中也可以看到,这也打印了echo %a命令和输出。有没有办法阻止这种情况?

如果我尝试类似的命令,我会得到所有条目,但仍然会得到echo %a输出垃圾邮件的结果。我不明白为什么下面会打印所有条目,但我的尝试%PATH%没有。我怀疑我不明白/F开关。

Z:\>for %a in (1 2 3) do echo %a

Z:\>echo 1
1

Z:\>echo 2
2

Z:\>echo 3
3

阅读 101

收藏
2022-03-25

共1个答案

小编典典

简单的方法是使用

for %a in ("%path:;=";"%") do @echo %~a

这适用于所有没有;路径且没有"单个元素的人
使用 path=C:\qt\4.6.3\bin;C:\Program Files;C:\documents & Settings 测试

但是“始终”的解决方案有点复杂
编辑:现在是一个工作变体

@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!;;
    但仅在引号之外;;,所以现在引号之外的分号和内部的分号之间存在差异^;^;
    那是关键。
2022-03-25