开发的游戏项目,需要一个工具,对指定的资源进行复制、加密,然后打包。之前打包时都手工操作,复制与加密这二步分别写了几个工具(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、CreateShortcutExpandEnvironmentStrings、LogEvent、Popup、RegDelete、RegRead、RegRead、RegWrite、Run、SendKeysExec

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进行学习

jscript调用bat注意事项的更多相关文章

  1. bat调用bat的一个巨坑

    [一个巨坑] a.bat的内容:echo 1b.batecho 2执行结果:运行a.bat时,输出1,然后调用b.bat, 但是 echo 2 显示不出来. bat怎么调用bat文件并返回? 例如主文 ...

  2. Windows下Java调用BAT批处理不弹出cmd窗口

    常规Windows下Java调用BAT方式肯定会弹出cmd窗口 Runtime.getRuntime().exec("cmd.exe /C start D:\\test.bat") ...

  3. vbs调用bat 隐藏bat运行时的黑框

    //新建文本文件 ,保存为后缀为bat.如:startBAT.vbs public const vbQuote="""" temp="C:\A_WOR ...

  4. as3调用外部应用程序 as调用外部exe文件as3调用bat文件 未测试

    private function callTest(event: Event): void{callExe("d:/a.exe");callBat("d:/a.bat&q ...

  5. windows下node.js调用bat

    node.js调用bat需要用到Child Processes模块 因为bat是文件,所以需要使用execFile方法   如果指定了cwd,它会切换bat执行的目录,类似cd的功能,如果未指定默认为 ...

  6. C++调用bat并实现传值

    1.设置环境变量,这一类为路径 C++ void bat(const string& sDirC, const string& sDirD) { char Ddir[256]; Ddi ...

  7. EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之Nodejs调用bat或sh脚本

    关于EasyDSS流媒体服务器 EasyDSS商用流媒体服务器解决方案是一套集流媒体点播.转码与管理.直播.录像.检索.时移回看于一体的一套完整的商用流媒体服务器解决方案,EasyDSS高性能RTMP ...

  8. C#- Winform调用BAT例子

    前段时间在工作的时候需要用到,百度了好久后找,可是找到了又希望调用的时候窗体不要显示出来. proc.StartInfo.CreateNoWindow = true;       proc.Start ...

  9. C#应用程序隐藏调用bat脚本

    做c#应用程序有些调用windows自带的bat脚本会比较方便 Process proc; proc = null; try { string targetDir = GetParentUrl() + ...

随机推荐

  1. 2017-2018-2 20155225《网络对抗技术》实验一 PC平台逆向破解

    2017-2018-2 20155225<网络对抗技术>实验一 PC平台逆向破解 1.直接修改程序机器指令,改变程序执行流程 理清思路: 我们的目标文件是一个linux可执行文件,格式为E ...

  2. 《jquery实战》javascript 必知必会(2)

    A2 一等公民函数 在传统 OO 语言里,对象包含数据和方法.这些语言里,数据和方法通常是不同的概念:javascript另辟蹊径. 与其他 js 的类型一样,函数可以作为对象处理,如String.N ...

  3. Qt_mingw搭建opencv开发环境

    Qt在windows下共有2个版本:mingw和msvc.其中mingw使用gcc编译器,msvc使用微软的VC编译器.针对不同版本Qt,使用Opencv的方式也不同. 区别 msvc, 可以使用op ...

  4. PHP 文件路径获取文件名

    物理截取 $file = '/www/htdocs/inc/lib.inc.php'; $filename = basename($file); echo $filename, '<br/> ...

  5. js跨越请求的2中实现 JSONP /后端接口设置运行跨越header

    由于浏览器同源策略,a域名的js向b域名ajax请求会被禁止.JS实现跨越访问接口有2中办法. 1.后端接口设置允许跨越的header头. //header('Access-Control-Allow ...

  6. ubuntun 18.04 desktop安装jupyter-notebook

    在ubuntu18.04要安装jupyter-notebook,当然前提是先安装python,然后按如下步骤安装jupyter-notebook,现在记录如下: 1.sudo apt-get upda ...

  7. 医学图像之DICOM格式解析

    最近导师给安排了新任务,由于刚进入实验室,对于医学图像这一块还一知半解,所以就想分享一下有关医学常见影像的学习(尤其是dicom后缀的图像文件),欢迎大家一起交流. 目录 1.医学影像学的介绍 2.D ...

  8. Java动态性之反射机制(reflection)

    说到反射机制,第一次接触的人可能会比较懵,反射?什么反射?怎么反射?反射是干嘛的?下面我将在这篇文章中讲讲Java的反射机制 不过在这之前,还有一个问题需要解决,标题名中的动态性,说起动态性,我先介绍 ...

  9. InnoDB的锁机制浅析(All in One)

    目录 InnoDB的锁机制浅析 1. 前言 2. 锁基本概念 2.1 共享锁和排它锁 2.2 意向锁-Intention Locks 2.3 锁的兼容性 3. InnoDB中的锁 3.1 准备工作 3 ...

  10. JavaScript的计时器的工作原理

    最近都在看一些JavaScript原理层面的文章,恰巧看到了jQuery的作者的一篇关于JavaScript计时器原理的解析,于是诚惶诚恐地决定把原文翻译成中文,一来是为了和大家分享,二来是为了加深自 ...