3

我想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_

$T 或 $t 分隔命令。当您创建宏或在 doskey 命令行上键入命令时,请使用这些特殊字符中的任何一个来分隔命令。这些特殊字符相当于在命令行中使用与号 (&)。

我猜^&是'逃避&符号',为什么这两个行为不同?

4

1 回答 1

4

有趣的是,我以前从未注意到差异。

使用$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>

如果您在主定义之前和之后添加和,您可以获得$T的输出看起来像^&echo offecho 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%with^&但你可以使用%v%with$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%

于 2019-11-24T16:50:50.097 回答