当前项目需要运行unix程序,后台需要x server支持.免费的Xming刚好可用.不过每次都需要手动开启xlaunch wizard,然后点3-4次下一步才能完成启动,这里找到一个命令行开启的方法,可以实现全自动.调用代码如下
xming.exe :0 -clipboard -multiwindow如果需要事先查询xming.exe是否已经运行,如果进程存在不做任何动作,只有当exe未运行时才开启,则使用下面的代码:
tasklist | find /i "xming.exe" || xming.exe :0 -clipboard -multiwindow但是这又有一个问题,||后面的代码会阻塞运行,xming.exe不结束之前,cmd窗口会一直等待,不会返回关闭.解决办法是使用类似
start /min "title" "C:\Program Files (x86)\Xming\Xming.exe" ":0 -clipboard -multiwindow"越来越复杂,因为这样又引入了另一个问题,虽然/min可以强制窗体最小化,但是用xlaunch打开的xming是无窗体的,只在托盘区有图标(也就是rootless模式),start指定最小化后,任务栏会多出来一个xming窗口,尝试过将-multiwindow替换为-rootless(xming的document解释说这2个参数是互斥的,不可同时使用),也没有用.继续寻找最优方案.
后来发现,vbs可以实现调用程序,无窗体运行.于是问题得到解决,方案为:写vbs文件,然后写bat文件(可能只写一个vbs也行?没有测试),将bat文件替换为:
tasklist | find /i "xming.exe" || exe.vbs如果要退出,可在最后加exit,运行后cmd窗口会自己关闭,如果需要bat文件删除自身,代码是
del %0
在vbs中运行,可以用run或者exec来执行,但是记住vbs中的引号需要注意,如果exe路径带有空格,必须在exe后面用双(双)引号闭合,然后再跟参数.例如:
Set ws= CreateObject("Wscript.Shell") ws.Run """C:\Program Files (x86)\Xming\Xming.exe"" :0 -clipboard -multiwindow""", 0如果需要删除vbs自身,可以加一行代码:
CreateObject("Scripting.FileSystemObject").DeleteFile WSH.ScriptFullName, True
附:
Start语法:
启动另一个窗口运行指定的程序或命令。
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/WAIT] [/B] [command/program]
[parameters]
"title" 在窗口标题栏中显示的标题。
path 起始目录
B 在不创建新窗口的情况下开始应用程序。除非
启动 ^C 处理,否则该应用程序会忽略 ^C 处理;
^Break 是唯一可以中断该应用程序的方式
I 新环境是传递给 cmd.exe 的原始环境,
而不是当前环境
MIN 开始时窗口最小化
MAX 开始时窗口最大化
SEPARATE 在分开的内存空间内开始 16 位 Windows 程序
SHARED 在共享内存空间内开始 16 位 Windows 程序
LOW 在 IDLE 优先级类别开始应用程序
NORMAL 在 NORMAL 优先级类别开始应用程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
ABOVENORMAL 在 ABOVENORMAL 优先级类别开始应用程序
BELOWNORMAL 在 BELOWNORMAL 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
command/program
如果是内部 cmd 命令或批文件,那么该命令处理器是
用 /K 命令行开关运行 cmd.exe 的。这表示该窗口在命令运行
后仍然存在。
如果不是内部 cmd 命令或批文件,则是一个程序,并
作为窗口应用程序或控制台应用程序运行。
parameters 这些为传送到命令/程序的参数
No comments :
Post a Comment