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
即可。
当命令没有输出时,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
即可。