【问题标题】:The doskey command separator produces blank linesdoskey 命令分隔符产生空行
【发布时间】:2016-10-07 22:37:46
【问题描述】:

当命令没有输出时,doskey 命令分隔符 ($T) 会生成一个空行。

C:\> set "a="                                                    

C:\> set "b="                                                    

C:\> doskey test=set "a=foo" $T set "b=bar" $T echo ^%a^% ^%b^%

C:\> test                                                      

C:\>                                                           
C:\> foo bar                                                   

注意test后的空行,影响可读性。

有一个众所周知的^?替代$T,不加空格,但新命令不继承环境变量。

C:\> set "a="                                                    

C:\> set "b="                                                    

C:\> doskey test=set "a=foo" ^& set "b=bar" ^& echo ^%a^% ^%b^%

C:\> test                                                      
%a% %b%     

这里没有空格,反正set在启动新命令后无效。

如何删除空行?

更新: 删除了“创建单独的进程”行,因为它是错误的。

【问题讨论】:

    标签: cmd macros command-line-interface alias doskey


    【解决方案1】:

    $T^& 之间的区别在于谁处理不同命令的执行。

    当使用$T 时,doskey 知道有多个命令,并且在当前cmd 实例中串行执行命令的是它自己,空白行和提示行作为副作用。

    当使用^& 时,doskey(正在检查$ 前缀字符)只看到一个没有任何特殊含义的字符。当宏被调用时,doskey 只执行一个命令(整行)并且是 cmd 解析器,现在可以看到串联的命令并处理串行执行,这次不需要额外的行。

    指示的“...它创建了一个不继承环境变量的单独进程。” 不正确。没有额外的过程。你看到的是通常的变量扩展“problem”。在解析时从行中删除变量读取操作以生成要执行的最终命令。您不能更改一行中的变量并在稍后的命令中从同一行检索更改的值,因为在开始执行将更改变量之前,在解析时替换了读取操作。 (阅读here

    所以,现在我们要解决的不是一个问题,而是两个问题。 ^& 情况下的变量扩展和$T 情况下的附加行。

    如果未启用延迟扩展,我们无法在命令行上下文中从当前cmd 实例启用它(仅在批处理文件中),因此,为了解决该问题,我们需要强制对行进行额外解析强制检索更改的值。我们可以在echo之前使用call命令

    doskey test=set "a=foo" ^& set "b=bar" ^& call echo ^%a^% ^%b^%
    

    但是解决其他问题更容易。空行和提示行是一个简单的echo 问题

    doskey test=echo off $t set "a=foo" $t set "b=bar" $t echo ^%a^% ^%b^% $t echo on
    

    在开头转echo off,在结尾转on

    【讨论】:

    • @antonio,确切地说,does not inherit environment variables 也不正确。 1) 不存在新进程 没有什么可继承 2) 变量没有回显,但它们已正确初始化,您可以将echo ^%a^% ^%b^% 替换为set 命令并查看它们,只是您无法直接检索它们的值.
    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 2012-12-28
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多