【问题标题】:How to workaround doskey's special character, like $L如何解决 doskey 的特殊字符,如 $L
【发布时间】:2013-05-08 04:26:10
【问题描述】:

我从这篇文章中得到了一个有用的提示: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目录中最先找到,真的很方便。

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

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

打电话给whichlib winsock32.lib,它喷出The system cannot find the file specified.

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

所以我意识到$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

【问题讨论】:

  • 与其尝试让它作为 doskey 别名工作,不如将其设为 whichlib.cmd 单行批处理文件:@for %%i in (%1) do @if NOT "%%~$LIB:i"=="" @echo %%~$LIB:i
  • 为了将来的参考,我认为大多数人更喜欢从控制台会话中复制粘贴 sn-ps 作为文本而不是图像。将文本格式化为代码通常效果很好。
  • 嗯,我明白了。我用截图来表明我不是单纯的想问我的问题,截图可以避免意外的复制粘贴错误,最终在视觉上很吸引人。
  • 我不知道为什么从控制台窗口复制/粘贴比粘贴屏幕截图更容易出错,文本通常比屏幕截图更容易阅读(特别是对于可能有视力的读者问题),就像我说的那样,有时将示例粘贴到编辑器中可以进行额外的分析或测试。

标签: cmd doskey


【解决方案1】:

我同意 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

【讨论】:

  • 很好的答案和解释,已验证!我以前用 CMD 命令 doskey /macrofile=F:\ChjConfigs\chjmacro.txt 加载我的 doskey 宏,现在我写在 chjmacro.txt whichlib=for %i in ($1) do @echo %~$^LIB:i 中,就像一个魅力。
  • 当然,最好在echo后面加一个点,即whichlib=for %i in ($1) do @echo.%~$^LIB:i,这样当找不到匹配的文件时,echo什么都不显示,而不是咕哝ECHO is on.
  • @JimmChen - 我知道它看起来不对,但 ECHO( 是唯一完全可靠的变体。ECHO。在一些晦涩的场景中可能会失败。
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 2016-08-29
  • 2013-10-07
  • 1970-01-01
  • 2010-09-29
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多