当前位置: 首页 > article >正文

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);
    }
}

http://www.kler.cn/a/596909.html

相关文章:

  • 2. 商城前端部署
  • 关于labview和C#调用 Bartender打印机条码
  • vue-splice方法
  • 正交分析法 + Prompt Optimizer:五维复杂测试用例设计的终极指南**
  • UNIX网络编程笔记:基本TCP套接字编程
  • 《Gradio Python 客户端入门》
  • Unity 与 JavaScript 的通信交互:实现跨平台的双向通信
  • 【FPGA开发】FPGA点亮LED灯(增加按键暂停恢复/复位操作)
  • 常用高压30V以上DCDC开关电源稳压器
  • Linux——线程
  • WMS仓储管理系统架构介绍
  • JavaWeek3-泛型,树和集合List接口
  • 西门子仿真实例位置
  • Maven环境搭建与配置
  • 建筑安全员考试:“知识拓展” 关键词驱动的深度备考攻略
  • 【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用
  • 向量库特点和使用场景
  • 强化学习(赵世钰版)-学习笔记(完)(10.Actor-Critic方法)
  • 【vue的some和filter】
  • C语言入门教程100讲(5)基本数据类型