Board logo

标题: [原创] 支持 VBS / JS 的终端控制、彩色显示类库 - TerminalController.vbs [打印本页]

作者: 老刘1号    时间: 2022-4-11 22:06     标题: 支持 VBS / JS 的终端控制、彩色显示类库 - TerminalController.vbs

本帖最后由 老刘1号 于 2023-4-9 22:24 编辑

GitHub








  1. ___ __, __, _, _ _ _, _  _, _,     _,  _, _, _ ___ __,  _, _,  _,  __, __,
  2.   |  |_  |_) |\/| | |\ | /_\ |     / ` / \ |\ |  |  |_) / \ |   |   |_  |_)
  3.   |  |   | \ |  | | | \| | | | ,   \ , \ / | \|  |  | \ \ / | , | , |   | \
  4.   ~  ~~~ ~ ~ ~  ~ ~ ~  ~ ~ ~ ~~~    ~   ~  ~  ~  ~  ~ ~  ~  ~~~ ~~~ ~~~ ~ ~
复制代码
VBSJScript 而生,由 VBS 写就的 COM 组件。

实用且便携的 Windows Terminal 控制类,可实现彩色输出、光标控制等功能。

浏览


开始

环境要求


安装

管理员权限运行以下命令:
  1. git clone https://github.com/OldLiu001/TerminalController.vbs.git
  2. cd TerminalController.vbs
  3. regsvr32 TerminalController.wsc
复制代码
警告:不要使用右键菜单注册 TerminalController.wsc

使用下列代码创建类的实例:

VBScript
  1. Set objTerminalController = CreateObject("Terminal.Controller")
复制代码
JScript
  1. var objTerminalController = new ActiveXObject("Terminal.Controller");
复制代码
便携

制作便携版本后,其他用户无需进行上述的安装操作即可使用您的脚本。

VBScript

方法1:使用 “Windows 脚本宿主文件” (WSF)

复制脚本 TerminalController.vbs 到您脚本所在的文件夹下。

假设您的脚本的文件名为 MyScript.vbs ,使用如下的代码模板:

Template.wsf
  1. <job id="MyScript">
  2.     <script language="VBScript" src="TerminalController.vbs"/>
  3.     <script language="VBScript" src="MyScript.vbs"/>
  4. </job>
复制代码
将其放置到您脚本所在的文件夹下。

或将脚本和类库都嵌入单个 WSF 中:

Template_Embedded.wsf
  1. <job id="MyScript">
  2.     <script language="VBScript">
  3.         ' 此处写 "TerminalController.vbs" 文件的内容
  4.     </script>
  5.     <script language="VBScript">
  6.         ' 此处写 "MyScript.vbs" 文件的内容
  7.     </script>
  8. </job>
复制代码
当然,您可以只将必要的部分嵌入 WSF 中,此处不再赘述。

创建类的实例:
  1. Set objTerminalController = New TerminalController
复制代码
方法2:使用 “ExecuteGlobal”

复制脚本 TerminalController.vbs 到您脚本所在的文件夹下。

将下列代码添加至脚本末尾:
  1. Sub Import(strFileName)
  2.     With CreateObject("Scripting.FileSystemObject")
  3.         ExecuteGlobal .OpenTextFile( _
  4.             .GetParentFolderName( _
  5.             .GetFile(WScript.ScriptFullName)) & _
  6.             "\" & strFileName).ReadAll
  7.     End With
  8. End Sub
复制代码
在脚本开头导入类库:
  1. Import "TerminalController.vbs"
复制代码
创建类的实例:
  1. Set objTerminalController = New TerminalController
复制代码
方法3: 将类库嵌入脚本中

将脚本 TerminalController.vbs 的内容添加至您的脚本末尾。

创建类的实例:
  1. Set objTerminalController = New TerminalController
复制代码
JScript

假设您的脚本名为 MyScript.js

类似 VBScript ,您可使用下列代码模板:

Template.wsf
  1. <job id="MyScript">
  2.     <script language="VBScript" src="TerminalController.vbs"/>
  3.     <script language="VBScript">
  4.         Function GenerateObject(ByVal strClassName)
  5.             Set GenerateObject = EVal("New " & strClassName)
  6.         End Function
  7.     </script>
  8.     <script language="JScript" src="MyScript.js" />
  9. </job>
复制代码
Template_Embedded.wsf
  1. <job id="MyScript">
  2.     <script language="VBScript">
  3.         ' 此处写 "TerminalController.vbs" 文件的内容
  4.     </script>
  5.     <script language="VBScript">
  6.         Function GenerateObject(ByVal strClassName)
  7.             Set GenerateObject = EVal("New " & strClassName)
  8.         End Function
  9.     </script>
  10.     <script language="JScript">
  11.         // 此处写 "MyScript.js" 文件的内容
  12.     </script>
  13. </job>
复制代码
创建类的实例:
  1. var objTerminalController = GenerateObject("TerminalController");
复制代码
用法

首先设置处理输出的回调函数。

可直接使用下列代码:

VBScript
  1. Function Printer(ByVal strControlSequence)
  2.     WScript.StdOut.Write strControlSequence
  3. End Function
  4. objTerminalController.SetPrinter GetRef("Printer")
复制代码
JScript
  1. objTerminalController.SetPrinter(function (strControlSequence) {
  2.     WScript.StdOut.Write(strControlSequence);
  3. });
复制代码
然后可以使用下列的若干方法控制终端:

名称参数等价控制序列描述
SaveCursorPosition-Chr(27) & "7"储存光标位置
RestoreCursorPosition-Chr(27) & "8"恢复光标位置
HideCursor-Chr(27) & "[?25l"隐藏光标
ShowCursor-Chr(27) & "[?25h"显示光标
SaveScreen-Chr(27) & "[?1049h"保存屏幕
RestoreScreen-Chr(27) & "[?1049l"恢复屏幕
ClearScreen-Chr(27) & "[2J"清除屏幕
LimitScolllngTop, lngBottomChr(27) & "[" & lngTop & ";" & lngBottom & "r"限制滚动
ReleseScoll-Chr(27) & "[r"解除滚动限制
MoveCursorToTopLeft-Chr(27) & "[H"将光标移动至终端左上角
MoveCursorTolngRow, lngColumnChr(27) & "[" & lngRow & ";" & lngColumn & "H"将光标移动至指定位置
MoveCursorToRowlngRowChr(27) & "[" & lngRow & "H"将光标移动至指定行
MoveCursorToColumnlngColumnChr(27) & "[" & lngColumn & "G"将光标移动至指定列
MoveCursorUplngCountChr(27) & "[" & lngCount & "A"光标上移若干行
MoveCursorDownlngCountChr(27) & "[" & lngCount & "B"光标下移若干行
MoveCursorLeftlngCountChr(27) & "[" & lngCount & "D"光标左移若干字符
MoveCursorRightlngCountChr(27) & "[" & lngCount & "C"光标右移若干字符
SetTextStylestrTextStyleChr(27) & "[" & strTextStyle & "m"设置文本类型
SetTextColorstrForeground, strBackgroundChr(27) & "[" & strForeground & ";" & strBackground & "m"设置文本颜色
ResetTextAttributes-Chr(27) & "[0m"重置文本属性


也有一些属性,可以获取终端的信息:

名称类型描述
RowLengthLong终端的总列数
ColumnLengthLong终端的总行数


参考

匈牙利命名:lng Long, str String, obj Object, arr Array.

颜色可选值:黑 Black, 红 Red, 绿 Green, 黄 Yellow, 蓝 Blue, 品红 Magenta, 青 Cyan, 白 White, 亮黑 BrightBlack, 亮红 BrightRed, 亮绿 BrightGreen, 亮黄 BrightYellow, 亮蓝 BrightBlue, 亮品红 BrightMagenta, 亮青 BrightCyan, 亮白 BrightWhite, 默认 Default.

文本类型可选值:常规 Normal, 粗体 Bold, 暗淡 Dim, 斜体 Italic, 下划线 Underline, 闪烁 Blink, 反色 Reverse, 隐藏 Invisible, 删除线 Strikeout.

示例

















参照


作者: czjt1234    时间: 2022-6-9 18:42

厉害                       .......................
作者: jyswjjgdwtdtj    时间: 2024-4-5 11:32

为什么我使用了如下的代码
  1. Set objTerminal = NEW TerminalController
  2. Function Printer(strControlSequence)
  3. WScript.StdOut.Write strControlSequence
  4. End Function
  5. objTerminal.SetPrinter GetRef("Printer")
  6. objTerminal.SetTextColor "Black", "Default"
  7. WScript.Echo "Foreground: Black"
  8. WSCRIPT.STDIN.READLINE
复制代码
然而却输出了
  1. Foreground: Black
复制代码
是我的电脑不支持改变颜色吗
作者: Five66    时间: 2024-4-5 12:37

回复 3# jyswjjgdwtdtj


    好像是终端控制码 win10才有这功能
参考
http://www.bathome.net/viewthread.php?tid=53595
作者: jyswjjgdwtdtj    时间: 2024-4-5 16:20

回复 4# Five66


    是win10
作者: 老刘1号    时间: 2024-4-5 18:16

回复 5# jyswjjgdwtdtj


    目前只测试了windows terminal,win10的话需要自己装一个windows terminal
win11自带所以就不用自己装了
作者: Five66    时间: 2024-4-5 18:25

回复 5# jyswjjgdwtdtj


    额 , 那链接里都说了:不是所有win10 版本都支持
还有查了下 , cmd的终端控制码好像是 Windows 10 build 18362 (外部版本 1903) 的新功能
作者: jyswjjgdwtdtj    时间: 2024-4-5 20:01

回复 7# Five66


    但是链接里的bat时钟彩色部分可以显示啊
作者: Five66    时间: 2024-4-5 21:46

回复 8# jyswjjgdwtdtj


请确保系统版本是win10 1903以上 , 并且CMD的属性框 不要勾选 使用旧版控制台
不行的话可能不关cmd的事 , 那就让自带的终端conhost来 , 方法是在注册表位置HKEY_CURRENT_USER\Console中新建一个DWORD类型的值 , 名字改成VirtualTerminalLevel ,并将其数值修改为1
还是不行的话就用上面大佬说的Windows Terminal这个新终端




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2