1

当命令没有输出时,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启动新命令后无效。

如何删除空白行?

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

4

1 回答 1

5

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

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

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

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

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

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

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结束时转动。

于 2016-10-08T09:17:42.443 回答