【译】Take Command 脚本语言基础

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 命令
  • 事件监视命令(触发器) —— 有单独的教程

下面将介绍每一项的内容:

开关

开关可以修改命令的功能。TCC的开关是CMD的超集,通常与其兼容。只能说通常,因为CMD的每个版本都不大一致。
例如,在 CMD 中,COPY 命令有 7 个开关(XCOPY 有更多)。TCL 的 COPY 命令有 34 个开关。其中 CMD 的 COPY 命令没有的一些开关如下:

  • /N 显示你如果执行这个命令的时候的输出,不会真的执行命令。
  • /O 仅在目标不存在时复制源文件。
  • /S 复制子目录树。
  • /H 复制所有匹配的文件,包括具有隐藏属性或系统属性的文件。
  • /W 删除源目录中有但目标目录没有的文件。(就是比源目录多出来的文件,其实就是同步)

用 TCL ,只需打两三个字符即可执行非常强大的操作。

别名

新增的开关是很强大,但有时候,你会连这两三个字符都懒得输。
你希望 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中的文件。

流程控制命令

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 的窗口。

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 的安全版本一起使用。

事件监视命令(触发器)

事件监视命令是 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 文件。


  1. 终端(程序):用户输入数据,显示其计算/运行结果的程序。 ↩︎

  2. 运行时:一个程序运行所需的依赖。即俗称的“环境”。 ↩︎

  3. TCL的各种运行时、IDE对比详见“Take Command 相关软件对比”。 ↩︎

posted @ 2021-04-18 09:30  老刘001  阅读(146)  评论(0编辑  收藏  举报