doskey命令分隔符生成空行

时间:2016-10-07 22:37:46

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

当命令不产生输出时,def main(): number1 = getNumber('number1') number2 = getNumber('number2') def getNumber(name): return input('Enter the value of ' + name)) 命令分隔符(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% 在启动新命令后无效。

如何删除空白行?

更新的 已删除"创建一个单独的流程"因为它错了。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

所以,现在,我们要解决两个问题而不是一个问题。 ^&案例中的变量扩展以及$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