我想在 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>
$TDoc



我猜 ^& 是' 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/

    10-12 21:42