2

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

如果您在 vbscript 中使用WshScript.Run,​​您将无法访问该过程的标准输入/错误/输出流。 WshScript.Exec允许您访问标准流,但您不能隐藏您的窗口。你怎么能得到你的蛋糕(隐藏窗户)并吃掉它(直接访问控制台流)?

我目前正在考虑一个 C++ 可执行文件,它创建一个新的 Windows Station 和 Desktop,(请参阅MSDN)并在该新桌面中运行指定的脚本(我还不是 Window Stations 和 Desktops 方面的专家,所以这个想法可能是迟钝)。

这个想法松散地基于CondorUSE_VISIBLE_DESKTOP功能,如果禁用,它会在不可见的桌面上运行 Condor 作业。我还没有完全弄清楚这是否需要提升特权。

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

有没有人有任何额外的想法?或对上述方法的反馈?

编辑:

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

4

4 回答 4

1

我对上面的 VBScript 片段没有任何运气 - 窗口仍然会弹出。但是我确实找到了一个名为hstart的工具,它看起来就像我需要的一样。不幸的是,它不是开源的,也不是免费用于商业用途的。

于 2009-02-04T18:50:08.427 回答
1

Cygwin ( http://www.cygwin.com/ ) 带有一个名为 run.exe 的实用程序,它可以满足您对通用进程的要求。您可以使用它来包装对 cscript 的调用。Cygwin 是 GNU,因此可免费用于商业或个人用途。

于 2009-02-04T19:05:08.723 回答
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.

于 2009-01-29T19:39:58.640 回答
0

您可以使用Exec,这是我编写的一个免费软件工具,它为 CreateProcess Windows API 调用提供命令行界面。GUI 版本本身没有控制台,您可以使用它在隐藏窗口中启动 shell 脚本(批处理文件)。

账单

于 2013-03-03T20:02:06.797 回答