使用cmd脚本运行java窗口程序(Swing界面),同时又要让CMD窗口隐藏且同时获得管理员权限
如果我们使用java开发Swing界面程序,运行的方法有两种:
1、直接打jar包时,指定Main的类,由Main类初始化界面。这样的好处是,可以直接通过jar包运行窗口程序(前提是机器上要装jre)。
2、通过操作系统的脚本语言,如Windows中就是cmd,后缀一般是bat(也有cmd的,bat与cmd是两个不同的命令体系,这一点大家要注意),在脚本里面调用java来启动jar包中指定的启动类即可。
以上两种方法各有优缺点:
1、直接jar包启动
- 优点:操作方便
- 缺点:需要装jre、不能在启动时指定参数、不能指定运行jar包时的内存等大小
2、使用脚本命令运行
- 优点:弥补以上缺点(不需要本地装jre,可以将jre打包到程序中,使用命令行指定java所在路径即可)
- 缺点:每次运行总是会附带弹出一个cmd窗口。本来这也不算什么缺点,但这个窗口因为显得很专业的样子,会让一些用户情不自禁地想关闭它!然后一关闭它时,连带被它启动的jar程序也会被关闭,也就是容易引起误操作。本来这样的误操作也没什么,但如果你的程序需要在关闭时要做点什么(比如我写的一个程序就是要在关闭程序时要关闭相关的数据库、清除临时数据等操作),这时候就麻烦了!
本文的重点就是为了解决第2点中cmd窗口的问题(不要问我为什么不使用第一种方式,因为我不想说用户是傻X,也是懒惰的,让他们装jre?开玩笑!),因为在试用时,经常会有人看到这个黑窗口时,就情不自禁地关掉,结果他们发现直接关闭黑窗口要比关闭jar窗口要快许多(因为cmd窗口是直接中断JVM,当然快,jar窗口关闭时要处理许多事情的,当然慢)!本来直接关闭黑窗口的方式也不影响,但他们还经常要把整个程序的文件夹删除重装(因为整个程序是绿色免安装的),这时候就会发生部分文件无法删除(因为数据库没有关闭嘛!),然后他们就会抱怨!所以这个问题,我得解决:
解决方案其实有两个:
1、将cmd窗口隐藏,强制用户关闭窗口进行关闭。这种方式,我查了许久、试验了很多次,在bat文件的开头加上这几行就行了:
if "%1" == "h" goto BEGIN mshta vbscript:createobject("wscript.shell").run("""%~dp0%%~nx0"" h",0)(window.close)&&exit
本以为这样OK了,结果:在运行时360报这个文件可能是病毒!唉~~
2、在程序文件夹中增加一个uninstall.bat文件。虽然这个程序是解压即可用,但为了防止用户乱关闭造成的问题,增加这个文件,让用户删除文件夹时使用这个文件进行卸载。而这个文件里就干一件事,调用关闭时要处理的事情即可,然后删除文件夹内所有的文件,最后提示用户“没有删除的文件请自己删除!”
另外,自从Windows升级到Vista之后,对权限的管理更加严格,如果当前用户不是电脑的管理员权限,则许多操作都需要获取管理员权限才能做,比如我们java程序中要调用启动Mysql数据库,这时候如果启动java程序的用户不是管理员权限,那java程序启动Mysql也一定会失败的!那该怎么处理呢?在cmd的命令中执行下面的语句即可:
%1 %2 ver|find "5.">nul&&goto :st mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :st","","runas",1)(window.close)&goto :eof :st copy "%~0" "%windir%\system32\" 你自己要执行的语句
现在如果大家想实现我标题中所要实现的要求,直接把两段代码放在一起是不行的!会出现死循环!作为程序员,要知道死循环的原因在哪儿!因为这两个语句都有if判断,且都会重新执行整个语句,所以为了让每次执行都会执行不同的条件,需要给执行的语句加上相应的参数即可,根据参数不同进行区分,合并如下:
%1 %2 ver|find "5.">nul&&goto :st mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :st","","runas",1)(window.close)&&exit :st copy "%~0" "%windir%\system32\" if "%3" == "h" goto :BEGIN mshta vbscript:createobject("wscript.shell").run("""%~dp0%%~nx0"" goto :st h",0)(window.close)&&exit :BEGIN 以下是你要执行的代码
如果大家有更好的方式,请不吝赐教啊,在此谢过!