doskey 命令分隔符产生空行

The doskey command separator produces blank lines

当命令没有输出时,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开始新命令后就失效了。

如何删除空行?

更新: 删除了 "creates a separate process" 行,因为它是错误的。

$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即可。