隐藏控制台而不会丢失标准错误/输出流

时间:2009-01-29 18:41:59

标签: scripting batch-file cmd

我的问题类似于Running a CMD or BAT in silent mode,但有一个额外的约束。

如果在vbscript中使用WshScript.Run,则无法访问该进程的/ error / out流中的标准。 WshScript.Exec可让您访问标准流,但无法隐藏窗口。你怎么能拥有你的蛋糕(隐藏窗户)并吃它(直接访问控制台流)?

我正在考虑创建一个新的Windows Station和桌面的C ++可执行文件(请参阅MSDN)并在该新桌面中运行指定的脚本(我还不是Window Station和桌面,所以这个想法可能会被推迟)。

这个想法基于CondorUSE_VISIBLE_DESKTOP功能,如果禁用,则会在不可见的桌面中运行Condor作业。我还没弄清楚这是否需要更高的奖励。

这种方法的权衡是,如果它阻止用户输入,你的脚本就会消失。

有没有人有任何其他想法?或者对上述方法的反馈意见?

修改:

此外,我们脚本的目的是设置用户环境,因此作为另一个用户运行,或作为系统计划任务运行实际上不是一个选项(除非有一些我不知道的聪明技巧)。

4 个答案:

答案 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脚本(批处理文件)。

比尔