wxappUnpacker的bingo.bat脚本逐行解读

薛定喵君 发表于 2021/09/24 20:41:47 2021/09/24
【摘要】 之前发过一篇文章小程序反编译工具在windows系统下的调用脚本提到了Windows平台下的脚本,但是对脚本没有做详细说明。本文就是针对脚本做的讲解。对批处理感兴趣的可以了解下。不会基础也没关系。下面我们进入正题。脚本解读第1行:# WXAPPUNPACKER_PATH 项目路径这段其实在 shell 文件中是注释内容,只不过在翻译这份脚本的时候是边查边写,复制过来没有修改,所以严格说这里属...

之前发过一篇文章小程序反编译工具在windows系统下的调用脚本提到了Windows平台下的脚本,但是对脚本没有做详细说明。本文就是针对脚本做的讲解。对批处理感兴趣的可以了解下。

不会基础也没关系。下面我们进入正题。

脚本解读

第1行:

# WXAPPUNPACKER_PATH 项目路径

这段其实在 shell 文件中是注释内容,只不过在翻译这份脚本的时候是边查边写,复制过来没有修改,所以严格说这里属于翻译错误,正确的内容应该是如下:

:: WXAPPUNPACKER_PATH 项目路径

:: 代表表示该行是注释内容

第2行:

set WXAPPUNPACKER_PATH=%~dp0

『%~dp0』是啥?

  • “d”为Drive的缩写,即为驱动器,磁盘

  • “p”为Path缩写,即为路径,目录 所以『%~dp0』就表示获取当前路径。

这段的作用就是定义了名为『WXAPPUNPACKER_PATH』的变量并且值为当前目录。

第4行:

set FILE_FORMAT=wxapkg

定义名为『FILE_FORMAT』的变量,值为 wxapkg

第6~12行:

:wxappUnpacker_pkg 

echo "node %WXAPPUNPACKER_PATH%/wuWxapkg.js %fname%"

node %WXAPPUNPACKER_PATH%/wuWxapkg.js %2 %1

goto:eof

这里定义了一个名为『wxappUnpacker_pkg』的函数,打印即将执行的脚本:"node [当前路径]/wuWxapkg.js [文件名]" 执行脚本:node [当前路径]/wuWxapkg.js 参数2 参数1

第14~32行:

:wxappUnpacker 

set de_dir=%1

  if "%de_dir%" == ""

      set de_dir=%WXAPPUNPACKER_PATH%

echo %de_dir%

echo "for wxapkg in `find %de_dir% "*.${FILE_FORMAT}"`"

for %%fname in `/f %de_dir% -name "*.%FILE_FORMAT%"`

  do

    (call :wxappUnpacker_pkg %fname% %2)

goto:eof

这里定义了一个函数,作用是循环调用解包命令。
遗憾的是这里的脚本存在翻译错误:
对比下 shell 脚本来看看,定义一个de_dir变量赋值为第一个传入参数。然后

if [ -z "$1" ]
  then
    de_dir=`pwd`
  fi

是要判断传入参数是否为空字符串,是空串就赋值为取当前目录的命令,所以这里就翻译错了,在MS-DOS下获取当前目录的命令为%cd%。再往下是循环查找wxapkg文件,同样也错了,正确的命令应该是
命令行环境:

for /f "delims=\" %i in ('dir /b /a-d /o-d "%cd%\*.%FILE_FORMAT%"') 
do 
    (call :wxappUnpacker_pkg %i $2)

批处理文件中:

@echo off
for /f "delims=\" %%i in ('dir /b /a-d /o-d "*.%FILE_FORMAT%"') do 
    (call :wxappUnpacker_pkg "%%i" $2)
  • 需要注意的是在批处理文件中引用变量需要两个百分号 %%

第34~44行:

:de_pkg

  if "-d" == "%1"

    (call :wxappUnpacker %1 %2)

  else

    (call :wxappUnpacker_pkg %1 %2)

goto:eof

这里定义了一个函数,作用是根据参数是否是目录来调用解包命令。

第46行:

# $1: pkg file or pkg dir; $2: order

这里也是翻译错误,应该在开头用::标记注释。

第48行:

call :de_pkg %1 %2

很简单,就是调用 de_pkg 函数,同时传入了两个参数。

基础知识

最后说几个基础知识

预定义的变量

  • %CD% - 扩展到当前目录字符串。

  • %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

  • %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

  • %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

  • %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

  • %CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。

  • %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

  • %0 bat的完整路径名如"C:\Windows\system32\xxx.bat"

    • 参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。

  • %1 bat参数1依次类推%2参数2...

  • %path% - 当前的环境变量。以分号隔开的路径列表,路径可包含空格,可以以''结尾, 可以以双引号包围之。

定义变量

SET <variable>=[<value>]

如果 <value> 是空字符串,则取消变量的定义,变量的值用双引号或空格结束。引号如果没有结束,则默认范围到行尾。

  • 如何使用 MS-DOS 脚本的调用参数

    ECHO %<n>
    

    N 的范围为 0-9 , %0 为文件名, %1-%9 为参数,每次调用脚本最多支持 9 个参数

    ECHO %*
    

    %* 代表所有传入的参数,即 %1-%9 ,并且包括其中的空白符

    • %*

    • %<n>

Echo 命令

打开回显或关闭请求回显功能,或显示消息。如果没有任何参数, echo 命令将显示当前回显设置。

语法 :

echo [{on │ off}] [message]

Sample :@echo off / echo hello world

@ 命令

表示不显示 @字符放在命令前将关闭该命令回显,无论此时回显是否处于打开状态。

Sample :@echo off

CALL命令

可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理 CALL [drive:][path]filename [batch-parameters] 调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。CALL :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头 以命令goto :eof结尾

其它还有很多命令,这里就不再赘述了,有兴趣的同学可以自行查阅。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。