InstallShield LE 打包MySQL

来源:互联网 发布:wind金融数据 编辑:程序博客网 时间:2024/05/01 08:47

之前软件使用的数据库是微软的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的用法:


很好,看来很适合用来实现文件中的特定内容替换。然后一开始就愉快地写下了:

for /f   %%i in  ("%cf%") do (set  "str=%%i"&set "str=!str:%%BaseDir%%=%mybase%!"&echo !str! >>_temp.ini)
然而这样做的替换是对"%cf%"这个字符串的替换,而不是这个地址对应文件的替换。应该多点耐心的,刚查看窗口还有一行“按任意键继续”啊,继续之后就有眉目了:

也就是说用一个“usebackq”就可以将双引号括起来的内容作为文件名了。注意看示例看看如果有两个关键字时是直接将他俩放在同一个双引号里面的。其实这些东西帮助文档里很全面,要用一个指令之前先了解一下它的用法看似浪费时间,但实际上可以避免一些低级错误的发生。

下一步就是mysql的初始化了。

::set commond=%mybase%bin\\mysqld.exe::地址中有空格会导致出错,此处改成短地址,好像不完全管用::for %%x in ("%commond%") do set commond=%%~sxset commond="%mybase%bin\\mysqld.exe"%commond% --initialize-insecure%commond% install MySQL2 --defaults-file="%mybase%my.ini"net start MySQL2set commond="%mybase%bin\\mysqld.exe"
--initialize是用来生成data文件夹的,然后就是安装、开启服务,和直接安装时是一致的。服务名用的mysql2,my.ini中给它设置的端口是3307,是防止用户已经安装了MySQL造成冲突。其实更好的方法应该是判断有没有安装MySQL的服务,然后再决定要不要安装吧。这里简单粗暴地偷懒了。这边如果set commond=%mybase%bin\\mysqld.exe且路径中存在空格的话,再执行下面的指令是会出问题的。百度后发现两种方案,第1-3行被注释掉的内容是第一种,将整个路径变为短路径也就不存在空格了,其实自己测试的时候是可以的,转化为短路径后是这样:


很完美,执行很OK。但是用别人电脑测试的时候就是:


短路径转换不完全,也不知道问题具体在哪。于是换成方案二,即直接加个双引号,注意文件名是在双引号里面的。这种方式其实更简单,一般情况下文件名加上双引号总是保险一点,包括后面的--defaults-file="%mybase%my.ini"也得注意这个问题。

下面的步骤是导入我们需要的数据库。

%commond% -uroot -P3307 < "%~dp0createdatabase.sql"%commond% -uroot twelve <"%~dp0backup.sql"

所用到的backup.sql是由本机导出的,指令是 

 mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名
鉴于目标机器中没有这个数据库,因此在批处理中先执行createdatabase.sql,内容如下:
drop database if exists twelve;create database if not exists twelve;show databases; 
作用是,创建数据库twelve,并显示当前所有的数据库。没必要显示,只是为了测试安装包时作为操作成功的判断依据,如果twelve在数据库列表中就表明数据库导入成功啦。
安装时的批处理文件基本完成。接下来可以测试一下批处理文件是不是写得正确,直接用打开dos测试,一定要以管理员身份打开,因为对C盘的操作以及服务的打开关闭都是需要管理员权限的。

以上mysqlsetup.bat在安装时执行,用于在安装软件时安装mysql并完成配置、开启服务。接下来写一个mysqlunistall.bat,卸载软件时执行。软件卸载时虽然会自动删除安装时添加的文件,但安装时没添加、但安装后生成的文件却不会删除,比如MySQL的data文件夹,只能自己动手。因此卸载时执行的脚本有两个作用:删除安装后生成的data文件夹;同时,卸载随软件安装的mysql服务。那么问题就来了,InstallShield LE里虽然可以添加卸载时执行的程序,但这个版本只可以添加“After System Changes”的Custom Action,但一旦“System Changes”,放在安装文件夹下的mysqlunistall.bat已经被删除掉了,根本无法执行。在这里卡了很久,觉得可能只有专业版InstallShield才可以了,后来想了个讨巧的方法,就是在安装时先复制一份mysqlunistall.bat命名为mysqlunistall1.bat,这份文件在卸载后是不会删除的,因此可以在Custom Action里执行它就好。有点蹩脚,应该有更合适的途径吧。这边遇到两个问题。第一个是在卸载时的脚本中,一开始移除服务我用的是mysqld --reomve -mysql2,而如上所述,此时整个安装目录除了data文件夹之外都已经被删除了,因此该指令不存在更无法使用。找到问题后,改用sc delete来移除服务。另一个问题是,我百度了一条删除批处理文件所在目录的命令,想在卸载时清空安装目录的,但卸载时出错,于是换成了只删除data文件夹的指令。之后想在批处理结束后删除其自身,虽然能删除但最后还是导致软件卸载失败因此也放弃了。所以本次安装卸载后还会有卸载残留,暂时不知道怎么解决。

准备好以上MySQL Server 5.7,mysqlsetup.bat、mysqlunistall两个批处理文件以及createdatabase.sql和数据库备份文件twelve.sql,就可以正式开始打包了。说一下重要易错的地方。

首先是安装目录的组织,里面的Release是待安装程序的Release文件夹:


接下来ShortCuts界面这边也要注意一下,默认目录里所有可执行文件都在里面,我保留了主程序,其他有关mysql的都删掉了,否则开始菜单的目录会有些可怕。此外添加了卸载的ShortCut:


着重要说的是如何执行写好的批处理文件。“解决方案管理器”中安装项目下,有一个“Define Setup Requirements and Actions”,选择“Custom Actions”,然后找到需要添加事件的项,右击选择New EXE,图中两个Action,分别用来执行写好的两个批处理文件:


设置如下:



Source Location不要选错,选择另一个,也就是“Browse File System”,虽然也可以选择cmd.exe,但只能在本机安装,换台机器就出错了。“File Name and Commond Line”中内容的意思是,调用cmd.exe,执行完后退出,且参数是安装目录中的mysqlsetup.bat/mysqlunistall1.bat,一定不要写错成mysqlunistall.bat,因为此时mysqlunistall.bat已经不存在了,只能调用安装时创建的副本了。

最后,关于安装包运行权限的问题。因为批处理中有些指令是需要管理员权限的,如服务的开启和关闭等,因此必须以管理员身份来安装。解决方案管理器”中安装项目下,"Prepare for Release"->Releases,因为用的SingleImage配置,所以选择SingleImage,然后设置如下:


到此,InstallShield打包MySQL基本完成。其间多次卸载失败,控制面板卸载、360等通通没用,可以使用“Window Installer Clean Up”,记得还要手动删除安装目录。这个工具一并放在附件中。下载链接:

点击打开链接


补充:程序中用到MySQL时的备份功能,即调用命令行执行 string cmdStr = "mysqldump" + " -P" + myParams["Port"] + " -u" + myParams["user id"]  + " " + DataBaseName + " > " + backPath;时需要设置环境变量,在安装设置中一并完成。


右击,添加新的环境变量。除了MySQL_Home,还要在Path上追加这个环境变量。PlaceMent均选择Append“”。安装时设置环境变量,会在卸载后删除。


或者也可以在安装的批处理文件中用如下指令:

set "set_val=%mybase%bin;%PATH%"  wmic ENVIRONMENT where "name='PATH' and username='<system>'" set VariableValue="%set_val%" 

0 0
原创粉丝点击