1 Sep 2013

命令行开启xming server

收藏到CSDN网摘



当前项目需要运行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