欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用cmd脚本运行java窗口程序(Swing界面),同时又要让CMD窗口隐藏且同时获得管理员权限

程序员文章站 2022-05-28 20:46:52
...

如果我们使用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

以下是你要执行的代码

 

 

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

相关标签: cmd jar包 swing