[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[教程] [译]Take Command 脚本语言基础

本帖最后由 老刘1号 于 2023-2-18 20:12 编辑

Take Command Language(以下简称为TCL)是一种命令语言。它良好的兼容了原生批处理语法,可构建简单或高度复杂的批处理程序。该语言也可以在终端上交互使用,以实现非常强大的实时计算机操作。其终端运行时(所有TCL运行时下文均以“运行环境”代称) Take Command Console (以下简称为TCC)甚至可以完美替换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
  1. 循环指定次数:DO 次数
  2. 死循环:DO FOREVER
  3. 循环并迭代:DO 变量名 = 起始值 TO 终之值 [BY 步长]
  4. 条件成立时循环:DO WHILE 条件
  5. 条件不成立时循环:DO UNTIL 条件
  6. 循环到指定时刻:DO UNTIL DATETIME 日期 时间
  7. 循环指定时长:DO FOR 数 [SECONDS | MINUTES | HOURS]
  8. 循环并迭代字符串集中的每个字符:DO 变量名 IN /C 字符串集
  9. 循环并迭代命令的返回值:DO varname in /P 命令
  10. 循环并迭代文本文件的每一行:DO varname IN @file
  11. DO varname IN [range...] [/I:"text" /S[n] /A:[-|+]hsad] fileset
  12. DO varname IN [/T"delimiters"] /L stringset
复制代码
TCL 也提供了一个非常给力的 IF..THEN..ELSE 结构。可通过 IFF 命令构造。

IF..THEN..ELSE
  1. IFF 条件1 THEN
  2.     命令集1
  3. [ELSEIFF 条件2 THEN 命令集2 ]
  4. ...
  5. [ELSE 命令集3 ]
  6. 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 结构
  1. inkey 输入一个字符: %%key
  2. switch %key
  3. case A
  4.     echo 是A
  5. case B .or. C
  6.     echo 是B或C
  7. default
  8.     echo 不是A、B、C
  9. 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 、等等。
  1. DO FOREVER
  2.     iff %_BATTERYPERCENT LT 25 MSGBOX 没电了
  3. ENDDO
复制代码
此命令将循环检查电池状态,并在电池电量不足时弹出一个消息框。MSGBOX 实际上是 TCC 中非常强大的命令。具体可在帮助文件中查看。

下面是一个示例,用于在运行应用程序之前检查是否有足够的可用资源。
  1. iff %_GDIFREE lt 40 then
  2.     echo GDI资源不足!
  3.     quit
  4. else
  5.     d:\mydir\myapp
  6. endiff
复制代码
变量函数

变量函数是 TCC 最强大的功能之一。变量函数与内部变量非常相似,但它们需要一个或多个参数(可以是环境变量,甚至是其他变量函数)。

可变函数很有用,可用于检查可用的系统资源、操作字符串和数字以及处理文件和文件名。

内置的 360 多个变量函数被分为 13 个类别。它们允许您以非常强大的方式收集和操作系统信息。(CMD 没有变量函数)


  • 二进制缓冲区
  • 日期和时间
  • 驱动器和设备
  • 文件内容
  • 文件名
  • 文件属性
  • 输入对话框
  • 监测
  • 网络相关属性
  • 数字和算术
  • 字符串和字符
  • 系统状态
  • 实用函数

使用函数,TCC 可以读取和写入文本文件,以及一些特殊文件,如 Windows 注册表或 .ini 文件。

祝贺新版块开首帖!!!

TOP

本帖最后由 locoman 于 2020-10-12 17:52 编辑

这个论坛一直都能充满勃勃生机和热情洋溢,就是得于有 @Batcher 、 @老刘1号 等这些管理员和版主们的无私奉献和热忱对人的精神和行动支撑着!

感谢有这个论坛!!

请问:
1. 要使用Take Command是不是就得在系统中重新安装Take Command?
2. 它编写的脚本文件可以使用bat扩展名吗?
3. 过去已编写可用的bat文件不会受影响运行吧?
4. Take Command对WINDOWS的版本和位数(32/64)有区别吗?

5. 用Take Command编写的脚本在没有安装Take Command的用户电脑上能直接运行吗?

——建议:
首先,弄一个全面的命令使用手册文档出来,这样,大家一对照就能直观理解和接受了。
再就是教会大家编写好脚本后,交给别人使用时,如何同时自动根据系统安装Take Command,否则,叫用户自己弄是很难接受而不好推广的。

TOP

祝贺新版块开首帖!!!
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

返回列表