【问题标题】:Hiding the console without losing std err/out streams隐藏控制台而不丢失标准错误/输出流
【发布时间】:2010-10-04 07:41:15
【问题描述】:

我的问题类似于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 作业。我还没有完全弄清楚这是否需要提升特权。

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

有没有人有其他想法?或对上述方法的反馈?

编辑:

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

【问题讨论】:

    标签: scripting batch-file cmd


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我只测试了一点,所以 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 调用的程序。

        【讨论】:

          【解决方案4】:

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

          比尔

          【讨论】:

            猜你喜欢
            • 2016-08-07
            • 2010-12-26
            • 1970-01-01
            • 2020-05-19
            • 2013-11-30
            • 2016-05-24
            • 2019-09-03
            • 1970-01-01
            • 2017-06-09
            相关资源
            最近更新 更多