此 Windows 命令的工作原理:echo %path:;=&echo.%

yek*_*chi 28 windows command-line

path在 Windows 命令行中搜索在变量内打印路径的解决方案我来到了这个解决方案。答案是这个命令:

echo %path:;=&echo.%
Run Code Online (Sandbox Code Playgroud)

现在我想知道这是如何工作的。

wiz*_*zz4 31

这是使用命令行变量替换。%path:;=&echo.%表示 " %path%,但将所有;s替换为&echo."。这意味着,与set path=C:\Windows\System32;C:\Windows\;;C:\Python37;

echo %path:;=&echo.%
Run Code Online (Sandbox Code Playgroud)

变成:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.
Run Code Online (Sandbox Code Playgroud)

由于&是命令分隔符,这相当于:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.
Run Code Online (Sandbox Code Playgroud)

由于 DOS Batch 的怪癖,除非后面没有任何内容,否则echo.与此相同。如果是这种情况,它只是不打印任何内容,而不是告诉您是打开还是关闭。这将使输出:echo ECHO

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 
Run Code Online (Sandbox Code Playgroud)

真的,应该echo.%path:;=&echo.%考虑%PATH%以 a 开头的情况;,但无论如何这个命令非常聪明。


进入详细的细节,真的 echo(应该使用而不是echo.. 这是因为echo.当您有一个名为 的文件时可能会出现问题echo,并且速度很慢,因为它每次运行时都必须检查磁盘(%CD%我认为也是所有%PATH%)。(我没有 Windows 的副本,所以我不能自己检查它;是文件的存在会影响它的%CD%任何地方或任何地方,它有什么作用?)%PATH%echoecho.

  • `echo.` 是人们多年前流传最多的一种。它是许多书中的一本。效率不是问题。各种文件碰巧存在时的古怪行为是。当我在 OS/2 中为 16 位 `cmd` 编写了一个 32 位替代品时,在这些标点符号处破坏命令名称以及这种高度不规则的解析行为是我故意不复制的事情之一,我把在记录的差异清单上。我创建了一个外部 `echodot` 命令,可以根据需要将其别名为 `echo.`。 (4认同)

Ber*_*end 24

这是我以前从未见过的有趣解决方案。让我试着解释一下:

  1. 要打印整个路径,请使用echo %path%. 这将在以分号 ( ;)分隔的单行上打印所有目录
  2. 要搜索/替换变量中的字符串,请使用%path:a=b%which 将替换所有a字符b
  3. echo. 用于打印换行符
  4. &用于分隔命令,例如echo line1&echo line2将打印两行
  5. 实际上,路径中的分号被替换为打印换行符的命令。或者它可能被解释为“;用空替换,然后打印一个换行符”。我找不到关于此的任何文档,所以这只是我的解释。坦率地说,我什至不知道这是可能的,但是你去了。更新我对这一步的解释似乎是错误的,wizzwizz4更好地解释了。

  • 这与 DOS 无关,Berend;并且 `echo.` 不是“打印换行符的命令”。这是_Microsoft's command interpreter_ for Windows NT,`cmd`;而`echo.` 只是打印路径元素的命令_确保如果路径元素为空,它不会切换到`echo`_ 的**其他** 功能。第一个 `echo` 也应该是一个 `echo.`。 (2认同)