Windows 如何创建一个DOSKEY alias命令,以打印窗口%PATH%,并在新行上显示每个条目?

Windows 如何创建一个DOSKEY alias命令,以打印窗口%PATH%,并在新行上显示每个条目?,windows,cmd,echo,doskey,Windows,Cmd,Echo,Doskey,我的任务和你的一样 我有一项任务:在新行打印%PATH%变量的所有条目。例如: C:\Program Files\ C:\Windows C:\Windows\System32 等等 这可以通过echo%路径实现:=&回声。%如前所述 我想使用 但是下面的脚本对我来说是失败的 DOSKEY list=echo %path:;=&echo.% 当我定义DOSKEY时,它只打印所有路径,然后,当我尝试调用list命令时,它就不起作用了。正如@eryksun所提到的,您需要转义特殊字符 更

我的任务和你的一样

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

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

这可以通过
echo%路径实现:=&回声。%
如前所述

我想使用

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

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

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

正如@eryksun所提到的,您需要转义特殊字符

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

doskey list=cmd /v:on /c "for %p in ("!path:;=" "!") do @echo %~p"
解释其工作原理:我们不能直接使用
echo^%path:的解决方案=^&echo.^%
因为它存储在已展开的宏中。为了防止这种情况,我尝试使用延迟扩展(带有
cmd/v:on/c
的部分)。它看起来几乎可以工作,但没有在新行上拆分(出于某种原因添加
&
,在延迟扩展时不起作用)


然后我开始寻找分割
的方法!路径
并找到了替换
的巧妙方法
(双引号空格)(
“!path:;=”!“
)。此拆分对于的普通
(没有
/f
选项)来说已经足够好了。剩下的是显而易见的。

正如@eryksun所提到的,你需要逃离特殊角色

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

doskey list=cmd /v:on /c "for %p in ("!path:;=" "!") do @echo %~p"
解释其工作原理:我们不能直接使用
echo^%path:的解决方案=^&echo.^%
因为它存储在已展开的宏中。为了防止这种情况,我尝试使用延迟扩展(带有
cmd/v:on/c
的部分)。它看起来几乎可以工作,但没有在新行上拆分(出于某种原因添加
&
,在延迟扩展时不起作用)


然后我开始寻找分割
的方法!路径
并找到了替换
的巧妙方法
(双引号空格)(
“!path:;=”!“
)。此拆分对于
的普通
(没有
/f
选项)来说已经足够好了。其余的很明显。

您必须将
&
特殊字符转义为
^&
,并且必须转义CMD的第一次传递环境变量扩展。在批处理脚本中,我们可以通过加倍来转义
%
。在命令行上,我们最好在百分比后面插入一个
^
字符来中断它,因为不应该有一个名为“^path”的环境变量。例如:
doskey list=echo%^path:=^&echo.%
。也就是说,doskey宏包装了控制台的功能,因此它们的使用有限。控制台(conhost.exe)在处理读取开始时匹配别名源,并将其替换为别名目标。目标程序(在本例中为cmd.exe)根本不涉及。因此doskey宏不能像真正的shell命令那样工作;我们不能通过管道连接到它们,也不能在批处理脚本中使用它们。如果您在
路径
目录中创建一个“list.bat”批处理脚本会更好。@eryksun这是否意味着我不能定义一个自定义命令来打印所有路径,每个路径都在单独的行上,而不生成单独的批处理脚本?这意味着如果您想在输出上执行类似循环的操作,则需要一个批处理脚本。例如,如果您的命令位于“list path.bat”中,您可以在命令行上运行
For/f“tokens=*%p in('list-path')do@echo%p
。这不能与控制台别名一起使用,因为控制台将只匹配并替换“列表路径”作为行的开头。显然,它也不能从批处理脚本中工作,因为它是从磁盘文件而不是控制台中读取的。此外,控制台别名在PowerShell中不起作用(例如,
doskey/exename=PowerShell.exe,无论哪个=where
),因为它使用低级控制台读取而不是经过处理的控制台读取。这不是什么大损失,因为PowerShell支持真正的shell别名和函数。您必须将
&
特殊字符转义为
^&
,并且必须转义CMD的第一次传递环境变量扩展。在批处理脚本中,我们可以通过加倍来转义
%
。在命令行上,我们最好在百分比后面插入一个
^
字符来中断它,因为不应该有一个名为“^path”的环境变量。例如:
doskey list=echo%^path:=^&echo.%
。也就是说,doskey宏包装了控制台的功能,因此它们的使用有限。控制台(conhost.exe)在处理读取开始时匹配别名源,并将其替换为别名目标。目标程序(在本例中为cmd.exe)根本不涉及。因此doskey宏不能像真正的shell命令那样工作;我们不能通过管道连接到它们,也不能在批处理脚本中使用它们。如果您在
路径
目录中创建一个“list.bat”批处理脚本会更好。@eryksun这是否意味着我不能定义一个自定义命令来打印所有路径,每个路径都在单独的行上,而不生成单独的批处理脚本?这意味着如果您想在输出上执行类似循环的操作,则需要一个批处理脚本。例如,如果您的命令位于“list path.bat”中,您可以在命令行上运行
For/f“tokens=*%p in('list-path')do@echo%p
。这不能与控制台别名一起使用,因为控制台将只匹配并替换“列表路径”作为行的开头。显然,它也不能从批处理脚本中工作,因为它是从磁盘文件而不是控制台中读取的。此外,控制台别名在PowerShell中不起作用(例如,
doskey/exename=PowerShell.exe,无论哪个=where
),因为它使用低级控制台读取而不是经过处理的控制台读取。这不是什么大损失,因为PowerShell支持真正的shell别名和函数。它可以工作,但不是我希望的那样。它静态地将“list”替换为“e”