4

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

(环境:Windows 7 和 Windows XP)

使用 Visual C++ 命令行,我们有 env-varsINCLUDELIB. 所以有了这个 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,它在运行时被当前驱动器号替换。

试试 double Dollar( @echo.%~$$LIB:i),还是不行,Procmon 报告 CMD 访问C:\echo

有人可以帮助我吗?

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

4

1 回答 1

4

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

但是......有可能做你想做的事:)

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

DOSKEY $ 替换发生在正常命令行解析之前。在宏定义中嵌入文字的技巧是在和$L之间放置一个中间字符,DOSKEY 不会将其视为特殊字符,但在正常命令行解析期间会消失 -效果很好。对DOSKEY没有特殊意义,只是在命令行解析时变成。$L^$^^LL

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

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

^定义宏时必须转义。所以定义宏的完整行变为:

doskey whichlib=for %i in ($1) do @echo(%~$^^LIB:i
于 2013-05-15T04:47:07.413 回答