我想在 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
最佳答案
最简单的方法就是使用
for %a in ("%path:;=";"%") do @echo %~a
这适用于所有没有 ;
的人在路径中,没有 "
围绕单个元素
测试路径=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!;;
...
但仅在引号之外,所以现在引号之外的分号之间存在差异;;
和里面^;^;
.
这就是关键。
关于windows - 'Pretty print' windows %PATH% variable - 如何在 CMD shell 中拆分 ';',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471556/