之前软件使用的数据库是微软的sql server,InstallShield Limited 2013中是可以直接打包的,现在需要改成mysqlserver,则需要自己写批处理把mysql打包进去。
先说一下准备工作。打包之前先试了一下在本机安装MySQL,了解了一下安装步骤,方便写脚本。
1、需要下载mysql的免安装版,文件夹名是MySQL Server 5.7,更改其中的my.ini文件,如果只有mydefault.ini,需要另存为my.ini再修改。
basedir="%BaseDir%"
datadir="%BaseDir%data"
port = 3307
其中basedir表示的是mysql的安装位置,datadir是数据库、错误日志等的存放位置。本机直接安装时可以把免安装版的mysql放在任何一个目录下,然后将%BaseDir%改成该目录的位置,就可以直接安装。但如果打包的话这个位置是由用户指定的,所以此处先保留%BaseDir%,批处理脚本中会将其替换成安装目录。
之后就可以开始写脚本了,因为之前没有接触过因此遇到很多小问题。新建一个文本文档,重命名为mysqlsetup.bat,就是我们安装时用的批处理文件了。
2、如上所述,脚本中第一步就是修改BaseDir为当前的安装目录。因为mysqlsetup.bat是放在根目录的,也就是把BaseDir改为mysqlsetup.bat所在位置就好。注意“MySQL Server 5.7”是和免安装版mysql的文件夹是一致的。
::切换路径
cd /d "%~dp0"
::改变my.ini中的目标文件夹地址
set mybase=%~dp0MySQL Server 5.7\
::防止地址中出现\n之类的转义字符导致出错
set mybase=%mybase:\=\\%
echo %mybase%
::文件名
set cf=%mybase%my.ini
::变量延迟扩展"usebackq"用来使后面的程序可以用引号括起来
setlocal EnableDelayedExpansion
::%是特殊字符,%%才表示%
for /f "usebackq delims=" %%i in ("%cf%") do (set "str=%%i"&set "str=!str:%%BaseDir%%=%mybase%!"&echo !str! >>_temp.ini)
::/y表示直接覆盖,没有提醒
move /y _temp.ini "%cf%"
过程就是将当前目录下的my.ini文件中所有的%BaseDir%替换成该目录下的MySQL Server 5.7文件夹地址。遇到两个因为特殊字符引起的问题。一个是%~dp0,也就是bat文件所在的地址,是以“\”隔开的,如果这个地址当中有特殊字符,比如是D:\njust,那这边\n就会被当做是回车符,运行时会报错,说不存在这个目录。解决方案就是再加上一个“\”。另一个是my.ini文件中mybase两边都有一个%,在批处理文件中要用到%必须改成%%才行。还有其他一些特殊字符前面是通过加“^”来转义。总之特殊字符的处理是新手写批处理的一个大坑啊。还有一个问题是因为对for语句的不了解。不要偷懒,在命令窗口中查看下for的用法: