当命令不产生输出时,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是无效的。
如何删除空白行?
更新:删除“创建一个单独的进程”行,因为它是错误的。
发布于 2016-10-08 09:17:42
$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。
https://stackoverflow.com/questions/39926685
复制相似问题