`
hellohank
  • 浏览: 143786 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用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

以下是你要执行的代码

 

 

如果大家有更好的方式,请不吝赐教啊,在此谢过!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics