【问题标题】:How to create a DOSKEY alias command to print Windows %PATH% with every entry on new line?如何创建一个 DOSKEY 别名命令以在新行上的每个条目打印 Windows %PATH%?
【发布时间】:2019-04-20 12:57:31
【问题描述】:

我和Print Windows %PATH% with every entry on new line有同样的任务

我有一个任务:在新行上打印 %PATH% 变量的所有条目。例如:

C:\Program Files\
C:\Windows
C:\Windows\System32

等等……

这可以通过echo %path:;=&echo.% 实现,正如here 解释的那样

我想将它分配给使用DOSKEY的命令别名

但是下面的脚本对我来说失败了

DOSKEY list=echo %path:;=&echo.%

它只是在我定义 DOSKEY 时打印所有路径,之后,当我尝试调用 list 命令时,它就不起作用了。

【问题讨论】:

  • 你必须将&特殊字符转义为^&,并且CMD的第一遍环境变量扩展必须被转义。在批处理脚本中,我们可以通过加倍来转义%。在命令行上,我们能做的最好的事情就是在百分号后面插入一个^ 字符来破坏它,因为不应该有一个名为“^path”的环境变量。例如:doskey list=echo %^path:;=^&echo.%.
  • 也就是说,doskey 宏封装了控制台的AddConsoleAlias 函数,因此它们的用途有限。控制台 (conhost.exe) 在处理读取开始时匹配别名源,并将其替换为别名目标。目标程序(在本例中为 cmd.exe)根本不涉及。因此 doskey 宏不能作为真正的 shell 命令工作;我们不能通过管道传递给它们,也不能在批处理脚本中使用它们。如果您在PATH 目录中创建一个“list.bat”批处理脚本会更好。
  • @eryksun 这是否意味着我不能定义一个自定义命令来打印所有路径,每个路径都在单独的行上,而不制作单独的批处理脚本?
  • 这意味着你需要一个批处理脚本,如果你想做一些类似循环输出的事情。例如,如果您的命令在“list-path.bat”中,您可以在命令行上运行for /f "tokens=*" %p in ('list-path') do @echo %p。这不能与控制台别名一起使用,因为控制台只会匹配并替换“list-path”作为行的开头。显然它也不能从批处理脚本中工作,因为它是从磁盘文件而不是控制台读取的。
  • 此外,控制台别名在 PowerShell 中不起作用(例如 doskey /exename=powershell.exe whichever=whatever),因为它使用低级控制台读取而不是处理后的控制台读取。损失不大,因为 PowerShell 支持真正的 shell 别名和函数。

标签: windows cmd echo doskey


【解决方案1】:

正如@eryksun 所述,您需要转义特殊字符。

更新:为了防止过早扩展 - 将使用延迟扩展。

doskey list=cmd /v:on /c "for %p in ("!path:;=" "!") do @echo %~p"

这是如何工作的解释:我们不能直接使用 echo ^%path:;=^&echo.^% 的解决方案,因为它存储在已经展开的宏中。为了防止这种情况,我尝试使用延迟扩展(cmd /v:on /c 的部分)。它似乎几乎可以工作,但没有拆分新行(由于某种原因添加 & 不适用于延迟扩展)。

然后我开始寻找一种拆分!path! 的方法,并找到了一个巧妙的技巧,将; 替换为" "(双引号空格)("!path:;=" "!")。这种拆分对于普通的for(没有/f 选项)来说已经足够了。其余的很明显。

【讨论】:

  • 它有效,但不是我希望的那样。它静态地将“list”替换为“echo 1^&echo.2^&echo.3”等等。这使得它无法用于我的情况。例如,如果我将新路径添加到 PATH,那么我必须再次重新定义“列表”宏。我们能克服这个问题吗?
  • @LPVOID 那是一个挑战。更新了答案。
  • 效果很好!太感谢了! :) 请你解释一下为什么它会这样工作?上面命令中每个术语的简要说明会很棒!
  • @LPVOID 我已经添加了解释。希望它足够清楚。
  • 你的回答真棒!非常感谢你的努力。 :)
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2010-12-15
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多