我从这篇文章中得到了一个有用的提示:https://stackoverflow.com/a/374363/151453,但受到doskey特殊字符的困扰。
(环境:Windows 7和Windows XP)
使用Visual C ++命令行,我们有env-vars INCLUDE
和LIB
。所以使用这个doskey宏,
doskey whichinclude=for %i in ($1) do @echo.%~$INCLUDE:i
我们可以很容易地找到哪个.h首先在哪个INCLUDE目录中找到,真的很方便。
但是,LIB
的这个技巧失败了。 我不能简单地编写像:
doskey whichlib=for %i in ($1) do @echo.%~$LIB:i
致电whichlib winsock32.lib
,它会咆哮The system cannot find the file specified.
我启动Procmon以了解会发生什么,它揭示了:
因此我意识到$L
对doskey
具有特殊含义,在运行时会被当前的驱动器号替换。
尝试双倍美元(@echo.%~$$LIB:i
),仍然无效,Procmon报告CMD访问C:\echo
。
有人帮助我吗?
我的doskey书签:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/doskey.mspx?mfr=true
答案 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