我的问题类似于Running a CMD or BAT in silent mode,但有一个额外的约束。
如果在vbscript中使用WshScript.Run,则无法访问该进程的/ error / out流中的标准。 WshScript.Exec可让您访问标准流,但无法隐藏窗口。你怎么能拥有你的蛋糕(隐藏窗户)并吃它(直接访问控制台流)?
我正在考虑创建一个新的Windows Station和桌面的C ++可执行文件(请参阅MSDN)并在该新桌面中运行指定的脚本(我还不是Window Station和桌面,所以这个想法可能会被推迟)。
这个想法基于Condor的USE_VISIBLE_DESKTOP
功能,如果禁用,则会在不可见的桌面中运行Condor作业。我还没弄清楚这是否需要更高的奖励。
这种方法的权衡是,如果它阻止用户输入,你的脚本就会消失。
有没有人有任何其他想法?或者对上述方法的反馈意见?
修改:
此外,我们脚本的目的是设置用户环境,因此作为另一个用户运行,或作为系统计划任务运行实际上不是一个选项(除非有一些我不知道的聪明技巧)。
答案 0 :(得分:1)
上面的VBScript片段我没有运气 - 窗口仍会弹出。但是我确实找到了一个名为hstart的工具,它看起来像我需要的东西。不幸的是,它不是开源的,也不是商业用途。
答案 1 :(得分:1)
Cygwin(http://www.cygwin.com/)附带了一个名为run.exe的实用程序,它可以执行您要求的通用进程。您可以使用它来包装您对cscript的调用。 Cygwin是GNU,免费用于商业或个人用途。
答案 2 :(得分:0)
我只测试了一下,所以YMMV ......
将以下代码放入.vbs文件(我称之为HideWindow.vbs):
Const HIDDEN_WINDOW = 12
computer = "."
Set oWmiService = GetObject("winmgmts:" & _
"{impersonationLevel=impersonate}!\\" & _
computer & "\root\cimv2")
Set oStartup = oWmiService.Get("Win32_ProcessStartup")
Set oConfig = oStartup.SpawnInstance_
oConfig.ShowWindow = HIDDEN_WINDOW
Set oProcess = GetObject("winmgmts:root\cimv2:Win32_Process")
ret = oProcess.Create("cmd.exe /c C:\Scripts\test.cmd", null, oConfig, pid)
从批处理文件或命令行中调用它,如下所示:
CSCRIPT HideWindow.vbs
您放入test.cmd
的内容无需显示窗口即可运行。这可以通过多种方式进行改进,尤其是通过参数化oProcess.Create
调用的程序。
答案 3 :(得分:0)
您可以使用我编写的免费软件Exec,它为CreateProcess Windows API调用提供命令行界面。 GUI版本本身没有控制台,您可以使用它在隐藏窗口中启动shell脚本(批处理文件)。
比尔