如何解决doskey的特殊角色,比如$ L.

时间:2013-05-14 01:45:16

标签: cmd doskey

我从这篇文章中得到了一个有用的提示:https://stackoverflow.com/a/374363/151453,但受到doskey特殊字符的困扰。

(环境:Windows 7和Windows XP)

使用Visual C ++命令行,我们有env-vars INCLUDELIB。所以使用这个doskey宏,

doskey whichinclude=for %i in ($1) do @echo.%~$INCLUDE:i

我们可以很容易地找到哪个.h首先在哪个INCLUDE目录中找到,真的很方便。

enter image description here

但是,LIB的这个技巧失败了。 我不能简单地编写像:

这样的宏
doskey whichlib=for %i in ($1) do @echo.%~$LIB:i

致电whichlib winsock32.lib,它会咆哮The system cannot find the file specified.

enter image description here

我启动Procmon以了解会发生什么,它揭示了:

enter image description here

因此我意识到$Ldoskey具有特殊含义,在运行时会被当前的驱动器号替换。

尝试双倍美元(@echo.%~$$LIB:i),仍然无效,Procmon报告CMD访问C:\echo

有人帮助我吗?

我的doskey书签:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/doskey.mspx?mfr=true

1 个答案:

答案 0 :(得分:4)

我同意Michael Burr的评论 - 你可能最好使用批处理文件。我通常不使用DOSKEY宏,因为它们不能在批处理文件中工作,所以它似乎毫无意义。在我看来,如果命令在命令行上运行,它也应该在批处理文件中工作。

但是......可以做你想做的事情:)。

如果后跟一个对DOSKEY有特殊含义的字符,则$只有特殊含义。 $L被解释为<字符(输入重定向)。 MS文档暗示$$L应该提供$L字面值,但文档不正确,正如您所发现的那样。

DOSKEY $替换发生在正常的命令行解析之前。在宏定义中嵌入文字$L的技巧是在$L之间放置一个介入字符,DOSKEY不会将其视为特殊字符,但在正常命令行中会消失解析 - ^完美无缺。 $^对DOSKEY没有特殊意义,^L在命令行解析过程中只变为L

您可以使用DOSKEY /M列出DOSKEY宏的定义。

您需要的完整定义是whichlib=for %i in ($1) do @echo(%~$^LIB:i

定义宏时,必须转义^。因此,定义宏的完整行变为:

doskey whichlib=for %i in ($1) do @echo(%~$^^LIB:i