windows 上的cscript javascript


在操作系统为了批量处理或者自动化运行等等运维开发事务,会选择一种脚本语言作为辅助。
在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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tadus_zeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值