我想在 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
之前的命令将 ST 集中在你想要的 $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
的 Doc 是我猜
^&
是' escape the ampersand ',为什么这两个表现不同? 最佳答案
有趣的是,我以前从未注意到差异。
使用 $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 时,doskey 会将整个构造视为一个命令,一次全部传递给 cmd.exe,因此您不会收到任何额外提示。请注意, ^
在定义阶段被消耗,因此只有 &
存储在定义中,而不是 ^&
。C:\test>doskey amp=echo command 1 ^& echo command 2
C:\test>amp
command 1
command 2
C:\test>
如果您在主定义之前和之后添加
$T
和 ^&
,您可以获得 echo off
输出看起来像 echo on
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 宏,那么我更愿意使用
^&
。但我很少使用它们,因为它们有严重的局限性:FOR /F %A in ('macro') do ...
&
、 &&
或 ||
更新
当我说
$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%
做一些事情。关于batch-file - doskey 中的 `^&` 和 `$T` 行为相似但不相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59019240/