jscript调用bat注意事项

开发的游戏项目,需要一个工具,对指定的资源进行复制、加密,然后打包。之前打包时都手工操作,复制与加密这二步分别写了几个工具(lua加密与图片资源加密是分开的),后来感觉bat操作路径特别麻烦,所以我改用了hta写了一个界面,让使用者可以输入版本号,控制台上显示程序运行状态…

写到的过程中,遇到几个坑,一并在这里记录下来。

===============================================

bat

遍历一个目录,并在另外一个目录创建相同的目录文件

cd /d %src_dir%
setlocal EnableDelayedExpansion
for /r /d %%i in (%src_dir%) do (
    set relativePath=%%i
    set relativePath=!relativePath:%src_dir%=!
    set targetFullPath=%target_dir%!relativePath! 

    if exist !targetFullPath! rd /s /q !targetFullPath!
    mkdir !targetFullPath!
)
endlocal

这里主要在于使用了“EnableDelayedExpansion” (延迟环境变量扩展),为什么要使用它呢?看下面的一个示例:

@echo off 
for /l %%i in (1,1,5) do ( 
    set var=%%i 
    echo %var% 
)

上面的代码执行后会输出5个空行,有人可能会问,不是把变量%%i赋值给var变量了吗?在这里如果想达到预期的目的,就需要使用“EnableDelayedExpansion”了

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
for /l %%i in (1,1,5) do ( 
    set var=%%i 
    echo !var! 
)
endlocal

在开启“EnableDelayedExpansion”中,使用!!来替换%%进行操作

字符串替换的语法:%var:str1=str2%,将字符串var中所有的str替换为str2

所以上面的=!relativePath:%src_dir%=!就容易理解了吧

bat中调用应用程序

start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]

start luac.exe –o path1 path2

hta调用bat

这个其实没有什么难度,方法也十分简单

var wsh = new ActiveXObject("WScript.Shell");

var rs = wsh.Run(“d:\xx\xx.bat param1 param2”, 0, true);

WScript.Shell 提供对本地Window外壳程序的访问,它拥有3个属性及11个方法。

属性:CurrentDirectoryEnvironmentSpecialFolders

方法:

AppActivate、CreateShortcut、ExpandEnvironmentStrings、LogEvent、Popup、RegDelete、RegRead、RegRead、RegWrite、Run、SendKeys、Exec

hta调用bat使用的就是Run方法,这里重点介绍一下Run方法

object.Run(strCommand, [intWindowStyle], [bWaitOnReturn]) 

参数

object

WshShell 对象。 strCommand表示要运行的命令行的字符串值。必须包括要传递到可执行文件的所有参数。 intWindowStyle可选。表示程序窗口外观的整数值。请注意,并非所有程序都使用此信息。 bWaitOnReturn可选。布尔值,表示在继续执行脚本中的下一条语句之前,脚本是否等待执行完程序。如果设为 true,则在执行完程序后才执行脚本,Run 方法返回由程序返回的任何错误代码。如果设为 false(默认值),则 Run 方法将自动在启动程序后立即返回 0(不是错误代码)。

Run 方法返回一个整数。Run 方法启动在新 Windows 进程中运行的程序。可以让脚本等到程序执行完后再继续执行。这允许您同步运行脚本和程序。strCommand 参数内的环境变量自动扩展。如果某个文件类型已正确注册到某个程序中,则对该类型的文件调用 Run 方法时将执行该程序。例如,如果您的计算机系统中装有 Word,则对 *.doc 文件调用 Run 方法时将启动 Word 并加载该文档。下表列出了 intWindowStyle 的可用设置。

在调用bat的时候可以传递参数,上面的param1、param2就是传入的参数,在bat中通过%1、%2..%n进行获取。

只是如果传入的参数是路径,必须是“\”而不能为“/”,否则某些应用程序在读取路径时会找不到路径,导致程序执行失败。

通过WScript.Shell对象获取应用程序的执行目录,例如现在想获得WinRAR的应用程序目录:

rarPath = wsh.RegRead("HKEY_CLASSES_ROOT\\WinRAR\\shell\\open\\command\\").match(/"([^"]*)"/)[1];

调用Run方法便可以调用它了

WinRAR常用的参数

a 添加文件到压缩文件 -r 包含子文件夹 -ep1 将需要打包的文件夹目录包含进去,-ep不包含 -inul 禁用所有消息 -df 压缩后删除文件 m<0..5>       设置压缩级别(0-存储...3-默认...5-最大)

-x 排除指定的文件

x@<列表> 排除指定列表文件中的文件

n<文件> 仅包含指定的文件

n@ 从标准输入设备读取文件名到包括

n@<列表> 在指定的文件列表包括文件

例:仅打包该目录下的*.xml文件 “WinRAR.exe a -ep -m5 -inul -n*.xml”

===============================================

如果想深入学习和了解bat,建议下载Visual Bat软件进行学习,内置chm帮助文档

hat,建议下载HtaEdit进行学习

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

servlet/filter/listener/interceptor区别与联系

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现 为什么st...

6620
来自专栏程序员阿凯

一条大河波浪宽 -- 数据库连接池实现

12040
来自专栏牛肉圆粉不加葱

Spark executor 模块② - AppClient 向 Master 注册 Application

前一篇文章简要介绍了 Spark 执行模块中几个主要的类以及 AppClient 是如何被创建的,这篇文章将详细的介绍 AppClient 向 Master 注...

8520
来自专栏web前端

myEclipse6.5与数据库(SQL Server2008)连接遇到的问题<用SSH框架的时候,用servlet+javabean+jsp的时候>

昨天因为学习SSH框架的搭建,时隔一年又重新遇到了myEclipse连接数据库的问题。废话不多说,上干货 (以下全部按照我遇到的问题的顺序,也就是没有顺序,就是...

23360
来自专栏DOTNET

【翻译】MongoDB指南/CRUD操作(三)

【原文地址】https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Tran...

30490
来自专栏java一日一条

Java EE7和Maven工程入门(4)

1.一个web maven模块(war) 2.一个支持无状态会话beans的ejb模块(EJB3.1) 3.支持实体beans的ejb模块(JPA2)

7610
来自专栏FreeBuf

Cookiel劫持测试工具 – Cookie Injecting Tools

Cookie Injecting Tools 是一款简单的开源cookie利用工具,是Chrome浏览器上开发的一个扩展插件,能够灵活地进行SQL注入测试,编辑...

27770
来自专栏互联网技术杂谈

beanstalkc Tutorial 中文版

英文原版:https://github.com/earl/beanstalkc/blob/wip-doc-rtfd/doc/tutorial.rst

35780
来自专栏java一日一条

servlet/filter/listener/interceptor区别与联系

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现 为什么st...

8820
来自专栏Golang语言社区

Golang语言社区--【游戏服务器知识】多线程并发

引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的...

34740

扫码关注云+社区

领取腾讯云代金券