Batch file `^&;`doskey中的“$T”的行为相似但不相同
我想在Batch file `^&;`doskey中的“$T”的行为相似但不相同,batch-file,sublimetext3,doskey,Batch File,Sublimetext3,Doskey,我想在cmd中打开一个文件,并在Sublime Text的特定组中编辑它,所以我创建了一个如下的doskey rem version 1, ^& doskey st="path_to\Sublime Text 3\sublime_text" --command "focus_group { \"group\": $1 }" ^& "path_to\Sublime Text 3\sublime_text" $2 rem version 2, $T doskey st="path_t
cmd
中打开一个文件,并在Sublime Text的特定组中编辑它,所以我创建了一个如下的doskey
rem version 1, ^&
doskey st="path_to\Sublime Text 3\sublime_text" --command "focus_group { \"group\": $1 }" ^& "path_to\Sublime Text 3\sublime_text" $2
rem version 2, $T
doskey st="path_to\Sublime Text 3\sublime_text" --command "focus_group { \"group\": $1 }" $T "path_to\Sublime Text 3\sublime_text" $2
^&
或$T
之前的命令将集中在所需的组$1
上,^&
或$T
之后的命令将打开文件$2
然后在cmd
>>> rem version 1, ^&
>>> st 0 test.py & rem press enter
>>>
----------------------------------
>>> rem version 2, $T
>>> st 0 test.py & rem press enter, one more prompt compare version 1
>>>
>>>
再来一次
rem alias.bat in C:\Windows\System32, work like alias in linux
doskey lscd1=dir ^& cd ..
doskey lscd2=dir $T cd ..
结果
path1\path2> lscd1
Volume in drive C is OS
Volume Serial Number is DA7D-663C
Directory of path2
11/24/2019 09:45 PM 0 test.py
path1>
---------------------------------
path1\path2> lscd2
Volume in drive C is OS
Volume Serial Number is DA7D-663C
Directory of path2
11/24/2019 09:45 PM 0 test.py
path1\path2>
path1>
$T
的
$T或$T分隔命令。在doskey命令行上创建宏或键入命令时,使用这些特殊字符中的任何一个来分隔命令。这些特殊字符相当于在命令行上使用符号(&)
我猜
^&
是“”,为什么这两个行为不同?有趣的是,我以前从未注意到这种差异
使用$T
时,宏会分别向cmd.exe发出每个命令,每个命令都会得到自己的提示。但是,随后的命令不会在屏幕上显示,因此看起来有点奇怪
例如:
C:\test>doskey $T=echo command 1 $T echo command 2
C:\test>$T
command 1
C:\test>command 2
C:\test>
使用^&
doskey时,会将整个构造视为一个命令,一次传递给cmd.exe,因此不会得到任何额外的提示。请注意,^
在定义阶段使用,因此定义中只存储&
,而不是^&
C:\test>doskey amp=echo command 1 ^& echo command 2
C:\test>amp
command 1
command 2
C:\test>
如果在主定义之前和之后添加echo off
和echo on
,则可以使$T
输出看起来像^&
C:\test>doskey $T2=echo off $T echo command 1 $T echo command 2 $T echo on
C:\test>$T2
command 1
command 2
C:\test>
如果我要使用doskey宏,那么我更喜欢使用^&
。但我很少使用它们,因为它们有严重的局限性:
- 它们在批处理脚本中使用时不会执行
- 它们与管道组合时不会执行
- 它们与('macro')中的/F%A一起使用时不执行。
- 当与任何串联运算符
、&
或&
组合时,它们不会执行|
$T
导致每个命令获得自己的提示时,这意味着每个命令都会被单独解析。这有一个潜在的优势,即您的宏可以设置变量var
,然后在以后访问值%var%
,而无需使用延迟扩展。当使用^&
时,所有命令都会一次解析,因此不能使用%var%
下面是一个愚蠢的例子,说明了如何不能将%v%
与^&
一起使用,但可以将%v%
与$t
一起使用
C:\test>set "v="
C:\test>doskey m1=set "v=OK" ^& echo v=%v% - doesn't work with ^^^^^^^& ^& set "v="
C:\test>m1
v=%v% - doesn't work with ^&
C:\test>doskey m2=set "v=OK" $T echo v=%v% - works with $^^T $T set "v="
C:\test>m2
C:\test>v=OK - works with $T
C:\test>
一个更实际的例子是一个宏,它执行一个命令,然后根据结果%errorlevel%
执行某些操作