windows 上的cscript javascript
文章目录
- 启用WSH
- gpedit.msc
- regedit
- WScript
- 输出
- 基本信息
- 命令行参数
- Sleep
- Timeout
- 退出
- ActiveXObject
- COM组件标识符
- COM组件的Methods
- 例子
- 下载文件
- 测试远程端口是否开放
在操作系统为了批量处理或者自动化运行等等运维开发事务,会选择一种脚本语言作为辅助。
在linux 上可以选择shell, 很多系统会预装python ,使用python 也是一种不错的选择。
在windows系统上可以选择 cmd,powershell, vbs,javascript。
因为脚本语言的流行程序与学习成本,javascript 是一种很好的选择。
在windows 可以使用系统自带的cscript.exe来执行javascript 脚本。
cscript.exe jsscript.js
wscript.exe jsscript.js
启用WSH
gpedit.msc
为了安全,管理员可能通过组策略禁用WSH (Windows Script Host)
需要使用gpedit.msc(本地组策略编辑器)来开启
计算机配置 > 管理模板 > Windows 组件 > Windows Script Host
双击右侧的 “禁用 Windows Script Host” 来选择启用项。
regedit
一些window版本没有组策略可以使用注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings
修改或创建 DWORD 值 Enabled, 1 为启用,0 为禁用。
WScript
使用Win + R
输入wscript可以看到
Wscript 就 windows 脚本宿主对象。
cscript 与 wscript 都是windows脚本宿主对象, cscript 是控制台版本,wscript 是窗口版本。
WScript 对象是Windows上特有的不支持跨平台
输出
WScript.Echo("Hello cscript javascript");
WScript.Echo(123);
var x = Object();
WScript.Echo(x);
WScript.StdOut.Write("std out");
WScript.StdOut.WriteLine("std out writeline");
WScript.StdErr.Write("std err");
WScript.StdErr.WriteLine("std err writeline");
基本信息
WScript.Echo(WScript.Version); // 返回 WSH 引擎版本。
WScript.Echo(WScript.FullName); // 返回当前脚本宿主程序的完整路径
WScript.Echo(WScript.ScriptName); // 返回当前脚本的文件名。
Wscript.Echo(WScript.ScriptFullName);// 返回当前脚本的完整路径
命令行参数
WScript.Echo(WScript.Arguments.length); // 命令参数数量
WScript.Echo(WScript.Arguments.Item(0)); // 输出第0个元素
Sleep
WScript.Sleep(2000); // sleep 2 sconds
Timeout
WScript.Timeout = 2;
while(true) {} // 在死循环2秒后脚本会超时退出
退出
WScript.Quit(0);
ActiveXObject
ActiveXObject 是cscript javascript 里面用来操作Windows COM 组件的对象
var obj = new ActiveXObject("COM组件标识符");
// 等效于
var obj = WScript.CreateObject("COM组件标识符");
var obj = WScript.GetObject("COM组件标识符");
Windows COM组件是微软旧时代的产物,不建议自行开发新的COM,可以使用Window 预装的COM组件。
COM组件标识符
打开regedit
在HKEY_CLASSES_ROOT/CLSID
目录下是己注册的COM组件
点开一个组件目录如HKEY_CLASSES_ROOT\CLSID\{72C24DD5-D70A-438B-8A42-98424B88AFB8}
可以看到下面有一项ProgID
ProgID的值就是 com组件的标识符
也可以使用oleview.exe ,装过WindowsSDK的都有,可以用everything 找一下。
oleview 看到的com组件像下面这样
COM组件的Methods
知道如何生成一个组件的实例,就要调用组件中的方法,可以使用oleview.exe 来查看组件有提供哪些方法
以WScript.Shell.1 为例
这样就可以看到所有的接口方法定义
例子
下载文件
利用 WinHttpRequest Component version 5.1 作网络请求
利用 ADODB.Stream 来保存二进制文件
// 文件名: download.js
try {
var url = "https://example.com/file.zip"; // 替换为目标URL
var savePath = "C:\\Downloads\\file.zip"; // 替换为保存路径
// 创建HTTP请求对象
var http = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
http.Open("GET", url, false);
http.SetRequestHeader("User-Agent", "Mozilla/5.0"); // 模拟浏览器请求
http.Send();
// 检查响应状态
if (http.Status != 200) {
throw new Error("HTTP请求失败,状态码: " + http.Status);
}
// 保存文件
var stream = new ActiveXObject("ADODB.Stream");
stream.Type = 1; // 二进制类型
stream.Open();
stream.Write(http.ResponseBody);
stream.SaveToFile(savePath, 2); // 2=覆盖已存在文件
stream.Close();
WScript.Echo("文件下载成功: " + savePath);
} catch (e) {
WScript.Echo("错误: " + e.message);
}
测试远程端口是否开放
try {
var host = "example.com";
var port = 80;
var timeout = 5000;
var shell = new ActiveXObject("WScript.Shell");
var cmd = 'cmd /c "telnet ' + host + ' ' + port + ' && echo OPEN || echo CLOSED"';
// 初始化时间戳
var startTime = new Date().getTime();
var exec = shell.Exec(cmd);
while (exec.Status === 0) {
// 检查超时
if (new Date().getTime() - startTime > timeout) {
exec.Terminate();
throw new Error("检测超时");
}
WScript.Sleep(100);
}
var output = exec.StdOut.ReadAll().toUpperCase();
if (output.indexOf("OPEN") !== -1) {
WScript.Echo("端口 " + port + " 开放");
} else {
WScript.Echo("端口 " + port + " 关闭或无法连接");
}
} catch (e) {
if (e.message.indexOf("无法找到文件") !== -1) {
WScript.Echo("错误: 请启用 Telnet 客户端");
} else {
WScript.Echo("错误: " + e.message);
}
}