【发布时间】: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 别名和函数。