Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file `^&;`doskey中的“$T”的行为相似但不相同_Batch File_Sublimetext3_Doskey - Fatal编程技术网

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%
执行某些操作