doskey 命令分隔符产生空行

ant*_*nio 1 macros alias cmd command-line-interface doskey

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                                                   
Run Code Online (Sandbox Code Playgroud)

注意发出后的空行test,这会影响可读性。

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

C:\> set "a="                                                    

C:\> set "b="                                                    

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

C:\> test                                                      
%a% %b%     
Run Code Online (Sandbox Code Playgroud)

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

如何去除空行?

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

MC *_* ND 5

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

$T使用时,doskey知道有一个以上的命令和它本身谁串行执行这些命令在当前的cmd情况下,与该空行和提示线作为副作用。

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

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

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

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

doskey test=set "a=foo" ^& set "b=bar" ^& call echo ^%a^% ^%b^%
Run Code Online (Sandbox Code Playgroud)

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

doskey test=echo off $t set "a=foo" $t set "b=bar" $t echo ^%a^% ^%b^% $t echo on
Run Code Online (Sandbox Code Playgroud)

只需echo off在开始和on结束时转弯。