Take Command Language(以下简称为TCL)是一种命令语言。它良好的兼容了原生批处理语法,可构建简单或高度复杂的批处理程序。该语言也可以在终端1上交互使用,以实现非常强大的实时计算机操作。其终端运行时2(所有TCL运行时下文均以“运行环境”代称) Take Command Console (以下简称为TCC)3甚至可以完美替换CMD。
概述
TCL 有很多要素。可分为三类:
- 内部命令:TCL主要的构成。常见命令如DIR、COPY、MOVE等。TCL 可让您即时访问超 235 个内部命令(CMD的内部命令少于 40 个)。
内部命令,指的是该命令内置在运行环境中。对于 CMD 来说,某些命令(如 XCOPY)实际上是单独的程序(可在%windir%\system32中找到XCOPY.EXE)。 - 内部变量:内部变量是运行环境中内置的特殊变量,用于提供有关系统的信息。它们不存储在系统环境变量中,但可以像环境变量一样在交互式命令、别名和批处理中进行访问。Take Command 提供了 270 多个内部变量,可以给您提供有关计算机及其运行的大量信息。包括已安装的硬件、硬件状态、操作系统信息和软件状态等。
- 变量函数:变量函数与内部变量非常相似,但它们需要传入一个或多个参数(可以是环境变量,甚至是其他变量函数)。变量函数可实现检查可用的系统资源、操作字符串和数字、处理文件和文件名等功能。运行环境中内置了 360 多个变量函数。
在本教程中,我们不会讨论 TCL 的所有功能(手册有 1300 页!)。我们将假设您了解 CMD 的基础知识,并指出 TCC 在工作中比 CMD 做得更好的一些事情。
内部命令
TCL 的内部命令有几个方面绝对值得一看:
- 开关
- 别名
- HTTP 和 FTP
- 流程控制命令
- KeyStack 命令
- 事件监视命令(触发器) —— 有单独的教程
下面将介绍每一项的内容:
1. 开关
开关可以修改命令的功能。TCC的开关是CMD的超集,通常与其兼容。只能说通常,因为CMD的每个版本都不大一致。
例如,在 CMD 中,COPY 命令有 7 个开关(XCOPY 有更多)。TCL 的 COPY 命令有 34 个开关。其中 CMD 的 COPY 命令没有的一些开关如下:
- /N 显示你如果执行这个命令的时候的输出,不会真的执行命令。
- /O 仅在目标不存在时复制源文件。
- /S 复制子目录树。
- /H 复制所有匹配的文件,包括具有隐藏属性或系统属性的文件。
- /W 删除源目录中有但目标目录没有的文件。(就是比源目录多出来的文件,其实就是同步)
用 TCL ,只需打两三个字符即可执行非常强大的操作。
2. 别名
新增的开关是很强大,但有时候,你会连这两三个字符都懒得输。
你希望 TCL 可以适配你常用的一些命令。
我们有一个解决方案——别名。TCL 的很多功能都通过别名结合在一起,这为您提供了创建自己的命令的能力。别名就是为命令或命令组起的新名字。
简单的别名将新名字替换为现有的命令。更复杂的别名可以重新定义内部或外部命令的默认设置、在内存中以非常快的速度运行批处理文件、基于其他命令的结果执行命令。TCC 还支持目录别名,可以方便指定路径的记忆。
别名可以自定义新命令。例如,DIR 命令可以以多种方式对目录进行排序。您可以创建一个名为 DE 的别名,功能是"按文件名和扩展名对目录进行排序,并在显示目录时在每个页面后暂停":
alias de=dir /oe /p
因此,您实际上不必记住所有开关。您可以自定义满足自身需求的 TCL 语言。例如,您可以创建与常见 Linux shell 命令匹配的别名,想要更舒适的话,还可以让其有相同的语法。
TCL 别名在几个关键方面与 CMD(及其外部命令 DOSKEY)不同。
- 您可以在批处理文件中使用别名。但 DOSKEY 定义的宏不能在批处理文件中使用。
- TCL 别名支持处理变量扩展,DOSKEY 搞不了这个。下面的例子创建了一个简单的命令行计算器。
alias calc=`echo The answer is: %@eval[%$]`
执行例子后,可以键入 CALC 3/7,你就能看到答案。变量函数 %@eval[%$]将由解析器解析执行。$占位符会被文本3/7替换,计算表达式的变量函数@eval将计算结果。 - 在 TCC 中,您可以将常用别名分配给击键。如:
alias @Shift-F5=*dir /2/p
执行例子后,每当您按下 Shift-F5 并回车,都会看到一个包含分页的双列目录。 - TCL 还允许目录别名,可以方便指定路径的记忆。例如,如果定义别名:
alias pf:=c:\program files
之后,您可以通过输入pf:\jpsoft来引用c:\program files\jpsoft中的文件。
3. 流程控制命令
CMD 最弱的部分之一就是流程控制。这些 IF…THEN…ELSE 、 DO 循环的结构,允许您开发复杂的批处理程序。如果要创建数据处理的批处理程序,CMD 中的各种限制会阻碍您程序的编写。
TCL 提供了一组非常丰富的流程控制结构,允许您实现(甚至超越)典型 Linux Shell 的功能。
以下示例显示了您可以创建的 DO 循环的一些类型:
注:方括号中的内容是可选的。
Do Loops
循环指定次数:DO 次数 死循环:DO FOREVER 循环并迭代:DO 变量名 = 起始值 TO 终之值 [BY 步长] 条件成立时循环:DO WHILE 条件 条件不成立时循环:DO UNTIL 条件 循环到指定时刻:DO UNTIL DATETIME 日期 时间 循环指定时长:DO FOR 数 [SECONDS | MINUTES | HOURS] 循环并迭代字符串集中的每个字符:DO 变量名 IN /C 字符串集 循环并迭代命令的返回值:DO varname in /P 命令 循环并迭代文本文件的每一行:DO varname IN @file DO varname IN [range...] [/I:"text" /S[n] /A:[-|+]hsad] fileset DO varname IN [/T"delimiters"] /L stringset
TCL 也提供了一个非常给力的 IF…THEN…ELSE 结构。可通过 IFF 命令构造。
IF…THEN…ELSE
IFF 条件1 THEN 命令集1 [ELSEIFF 条件2 THEN 命令集2 ] ... [ELSE 命令集3 ] ENDIFF
下面例子中的别名将检查参数是否为子目录。若是,则将删除该目录(包括其中的文件):
alias prune `iff isdir %1 then & del /s /x /z %1 & else & echo %1 is not a directory! & endiff`
下面的例子展示 SWITCH 结构的工作规则。如果用户按 A,则下面的批处理文件片段将显示一条消息;如果用户按 B 或 C,则显示另一条消息;如果用户按任何其他键,则显示第三条消息。
Switch 结构
inkey 输入一个字符: %%key switch %key case A echo 是A case B .or. C echo 是B或C default echo 不是A、B、C endswitch
KEYSTACK
KEYSTACK 可进行按键模拟,并将它们发送至程序或命令,就像在键盘上键入一样。
KEYSTACK 通常用于从批处理文件启动的程序。例如,若要启动 Word 并打开您使用的最后一个文档,可以使用以下命令:
start word & keystack /w54 alt-f "1"
这会导致以下情况:
- word 被打开,
- /w 开关会产生约 3 秒的延迟(每个时钟刻度约 1/18 秒),
- 将 alt-F(文件下拉菜单)和 1(打开最近使用的文件)的击键放入缓冲区。
Word 会接收这些击键并执行相应的操作。请注意,两个命令"START"和"KEYSTACK"是在单行上发出的。这可确保击键发送到 Word 的窗口。
5. FTP 和 HTTP
TCL 的 FTP 和 HTTP 命令允许您将 http 和 ftp 站点视为本地磁盘驱动器。相比CMD,这是一个巨大的优势。在互联网世界中,我们向您展示如何使用这些命令创建实用的远程监视应用程序。
在最简单的情形中,您可以把 FTP 或 HTTP 站点当作本地磁盘。例如,要获取 JPSoftware FTP 站点的目录,可以使用以下命令:
dir ftp://ftp.jpsoft.com/*
下面的例子演示 ftp 用户名和密码如何包含到命令中:
dir ftp://用户名:密码@ftp.abc.com/mydir/*
互联网站点也可使用 DIR,COPY,MOVE,DEL 等命令。这些命令也支持与 FTP 和 HTTP 的安全版本一起使用。
6. 事件监视命令(触发器)
事件监视命令是 TCL 中最强大的功能之一。它们允许您在计算机上监视各种活动,并"触发"流程以采取行动或报告问题。
这块内容有单独的教程。
内部变量
内部变量是运行环境中内置的特殊变量,用于提供有关系统的信息。它们不存储在系统环境变量中,但可以像在交互式命令、别名和批处理文件中的环境变量一样进行访问。
内部变量的数目超过 280 个(CMD 连 10 个都没有)。变量的主要类型包括:
- 硬件状态
- 操作系统和软件状态
- 日期和时间
- 驱动器和目录
- 错误代码
- 屏幕、颜色和光标
- TC状态
- 兼容性
下面是如何使用称为“_DOW”的变量(返回今天是星期几)的简单例子:
if "%_DOW" == "Mon" call c:\cleanup\weekly.bat
如果今天是星期一,此示例调用另一个批处理文件。
一个补充说明:
%符号有什么用?当您在变量或函数前面看到%符号时,这意味着解析器应计算函数,并将其文本值替换变量或函数。因此,在上一个示例中,_DOW将替换为结果,在这种情况下,结果将会是 MON、TUE 、等等。
DO FOREVER iff %_BATTERYPERCENT LT 25 MSGBOX 没电了 ENDDO
此命令将循环检查电池状态,并在电池电量不足时弹出一个消息框。MSGBOX 实际上是 TCC 中非常强大的命令。具体可在帮助文件中查看。
下面是一个示例,用于在运行应用程序之前检查是否有足够的可用资源。
iff %_GDIFREE lt 40 then echo GDI资源不足! quit else d:\mydir\myapp endiff
变量函数
变量函数是 TCC 最强大的功能之一。变量函数与内部变量非常相似,但它们需要一个或多个参数(可以是环境变量,甚至是其他变量函数)。
可变函数很有用,可用于检查可用的系统资源、操作字符串和数字以及处理文件和文件名。
内置的 360 多个变量函数被分为 13 个类别。它们允许您以非常强大的方式收集和操作系统信息。(CMD 没有变量函数)
- 二进制缓冲区
- 日期和时间
- 驱动器和设备
- 文件内容
- 文件名
- 文件属性
- 输入对话框
- 监测
- 网络相关属性
- 数字和算术
- 字符串和字符
- 系统状态
- 实用函数
使用函数,TCC 可以读取和写入文本文件,以及一些特殊文件,如 Windows 注册表或 .ini 文件。
终端(程序):用户输入数据,显示其计算/运行结果的程序。 ↩︎
运行时:一个程序运行所需的依赖。即俗称的“环境”。 ↩︎
TCL的各种运行时、IDE对比详见“Take Command 相关软件对比”。 ↩︎