【问题标题】:Hide Command Window of .BAT file that Executes Another .EXE File隐藏执行另一个 .EXE 文件的 .BAT 文件的命令窗口
【发布时间】:2010-10-05 04:11:18
【问题描述】:

这是 Windows 中的批处理文件。

这是我的 .bat 文件

@echo off
copy "C:\Remoting.config-Training" "C:\Remoting.config"

"C:\ThirdParty.exe"

除了 .bat 文件让命令窗口在“第三方”应用程序运行的整个过程中保持打开状态之外,这工作正常。
我需要关闭命令窗口。

我会为应用程序使用快捷方式,但我必须能够首先运行此复制命令(它实际上会更改应用程序使用的数据库和服务器)。

第三方应用程序不允许用户更改数据库或应用程序服务器的来源。

我们这样做是为了允许用户从测试环境更改为生产环境。

【问题讨论】:

  • 刚找到这个,我想,隐藏一个待命的控制台窗口真的很方便:raymond.cc/blog/…

标签: windows command-line copy executable


【解决方案1】:

我还没有真正找到一个很好的方法来做这件事,所以我只使用了一个名为hstart 的实用程序来为我做这件事。如果有更简洁的方法,那就太好了。

【讨论】:

  • HSTART 是用于替换 CMD 窗口的出色实用程序,此外它还可以与 PowerShell 和 Ruby 一起使用
【解决方案2】:

试试这个:

@echo off 
copy "C:\Remoting.config-Training" "C:\Remoting.config"
start C:\ThirdParty.exe
exit

【讨论】:

  • 不要在 C:\ThirdParty.exe 周围使用引号,这样可以完美运行。
  • 这对我有用。如果没有退出命令,终端将保持 aliva
【解决方案3】:

使用start 对我有用:

@echo off
copy "C:\Remoting.config-Training" "C:\Remoting.config"
start C:\ThirdParty.exe

编辑:好的,仔细观察,start 似乎将第一个参数解释为新窗口标题(如果引用)。因此,如果您需要引用 ThirdParty.exe 的路径,您还必须提供标题字符串。

例子:

:: Title not needed:
start C:\ThirdParty.exe

:: Title needed
start "Third Party App" "C:\Program Files\Vendor\ThirdParty.exe"

【讨论】:

  • 现在第三方应用程序无法启动,我的命令窗口保持打开状态。
  • 是的,你是对的。当我使用它时,我没有引用我的应用程序的路径。请看看我修改后的答案。
  • 感谢 Patrick Cuff 改进了我的回答。我还是新手,直到现在才意识到足够的声誉可以让你编辑其他人的帖子......
【解决方案4】:

请用这个,上面的不行。我已经在 Window server 2003 中测试过了。

@echo off 
copy "C:\Remoting.config-Training" "C:\Remoting.config"
Start /I "" "C:\ThirdParty.exe"
exit

【讨论】:

  • 您遇到什么错误表明“以上”不起作用?可能是因为您使用的是 Windows Server?
【解决方案5】:

使用start 可以正常工作,除非您使用的是脚本语言。幸运的是,Python 有一条出路——只需使用 pythonw.exe 而不是 python.exe

:: Title not needed:
start pythonw.exe application.py

如果您需要引号,请执行以下操作:

:: Title needed
start "Great Python App" pythonw.exe "C:\Program Files\Vendor\App\application.py"

【讨论】:

    【解决方案6】:

    在不同的用户下运行它。假设这是一个 Windows 框,为计划任务创建一个用户帐户。以该用户身份运行它。命令提示符只会显示给当前登录的用户。

    【讨论】:

      【解决方案7】:

      很棒的提示。它也适用于运行 java 程序的批处理文件。

      start javaw -classpath "%CP%" main.Main
      

      【讨论】:

      • 这对我来说非常有用,但我所要做的就是将 start javaw mainClass 保存到我的 .bat 文件中,这很棒!
      【解决方案8】:

      使用 Batch2Exe http://www.f2ko.de/programs.php?lang=en&pid=b2e 将批处理文件编译为可执行文件。 使用“不可见窗口”选项。

      【讨论】:

      • 没有足够的关于这个应用程序的信息让我在尝试它时感觉很舒服。常问问题。演示,不仅仅是一个选项卡的屏幕截图。
      • Softpedia 似乎对此有很好的看法:Bat To Exe 转换器 1.6.0 - SOFTPEDIA “100% CLEAN”奖。这是另一个下载链接:softpedia.com/get/System/File-Management/…
      • 我用过。它可以在我的一台计算机上运行,​​但我将 exe 文件移到另一台计算机上,它们无法在它上面运行。
      【解决方案9】:

      您可能有兴趣尝试我的silentbatch 程序,该程序将运行.bat/.cmd 脚本,完全禁止创建命令提示符窗口(因此您不会看到它出现然后消失),并可选择将输出记录到指定文件。

      【讨论】:

      • 实施了类似的解决方案。看起来这个问题是作为附加答案发布的好地方。干杯
      【解决方案10】:

      您可以创建一个强制隐藏窗口的 VBS 脚本。

      Set WshShell = WScript.CreateObject("WScript.Shell")
      obj = WshShell.Run("""C:\Program Files (x86)\McKesson\HRS
      Distributed\SwE.bat""", 0)
      set WshShell = Nothing
      

      然后,不执行批处理文件,而是执行脚本。

      【讨论】:

        【解决方案11】:

        使用此代码创建一个.vbs 文件:

        CreateObject("Wscript.Shell").Run "your_batch.bat",0,True
        

        这个.vbs 将运行your_batch.bat hidden。

        对我来说很好。

        【讨论】:

        • 对我来说它需要以WScript.CreateObject 开头,如果你想通过使用传递参数:`WScript.CreateObject("Wscript.Shell").Run "your_batch.bat """ & WScript.Arguments.Item(0) & """",0,True
        【解决方案12】:

        要使执行 .exe 文件的 .bat 文件的命令窗口尽快退出,请在您尝试执行的文件之前使用 @start 行。这是一个例子:

        (insert other code here)
        @start executable.exe
        (insert other code here)
        

        您不必将其他代码与@start executable.exe 一起使用。

        【讨论】:

          【解决方案13】:

          或者你可以使用:

          Start /d "the directory of the executable" /b "the name of the executable" "parameters of the executable" %1
          

          如果 %1 是一个文件,那么它将被传递给您的可执行文件。例如在notepad.exe foo.txt %1 是“foo.txt”。

          启动命令的/b 参数是这样做的:

          启动应用程序而不打开新的命令提示符窗口。 CTRL+C 处理将被忽略,除非应用程序启用 CTRL+C 处理。使用 CTRL+BREAK 来中断应用程序。

          这正是我们想要的。

          【讨论】:

          • 这是最好的答案!
          【解决方案14】:

          我用它从 C# 启动一个 cmd 文件:

          Process proc = new Process();
          proc.StartInfo.WorkingDirectory = "myWorkingDirectory";
          proc.StartInfo.FileName = "myFileName.cmd";
          proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
          proc.Start();
          proc.WaitForExit();
          

          【讨论】:

            【解决方案15】:

            使用 Windows API,我们可以启动新进程、控制台应用程序,并隐藏其“黑色”窗口。这可以在进程创建时完成,并且完全避免显示“黑色”窗口。

            CreateProcess函数中dwCreationFlags参数可以有CREATE_NO_WINDOW标志:

            The process is a console application that is being run
            without a console window. Therefore, the console handle
            for the application is not set. This flag is ignored if
            the application is not a console application
            

            这里是使用此方法的hide-win32-console-window executablesource code 的链接。

            hide-win32-console-window 类似于Jamesdlin's silentbatch program

            有一个悬而未决的问题:当程序的窗口不存在时如何处理程序的输出?如果发生异常怎么办?丢弃输出不是一个好的解决方案。 hide-win32-console-window 使用匿名管道将程序的输出重定向到当前目录中创建的文件。

            用法

            batchscript_starter.exe full/path/to/application [要传递的参数]

            运行python脚本示例

            batchscript_starter.exe c:\Python27\python.exe -c "import time; print('prog start'); time.sleep(3.0); print('prog end');"
            

            在名为python.2019-05-13-13-32-39.log 的工作目录中创建输出文件,其中包含python 命令的输出:

            prog start
            prog end
            

            运行命令示例

            batchscript_starter.exe C:\WINDOWS\system32\cmd.exe /C dir .
            

            输出文件在名为cmd.2019-05-13-13-37-28.log的工作目录中创建,输出来自CMD:

             Volume in drive Z is Storage
             Volume Serial Number is XXXX-YYYY
            
             Directory of hide_console_project\hide-win32-console-window
            
            2019-05-13  13:37    <DIR>          .
            2019-05-13  13:37    <DIR>          ..
            2019-05-13  04:41            17,274 batchscript_starter.cpp
            2018-04-10  01:08            46,227 batchscript_starter.ico
            2019-05-12  11:27             7,042 batchscript_starter.rc
            2019-05-12  11:27             1,451 batchscript_starter.sln
            2019-05-12  21:51             8,943 batchscript_starter.vcxproj
            2019-05-12  21:51             1,664 batchscript_starter.vcxproj.filters
            2019-05-13  03:38             1,736 batchscript_starter.vcxproj.user
            2019-05-13  13:37                 0 cmd.2019-05-13-13-37-28.log
            2019-05-13  04:34             1,518 LICENSE
            2019-05-13  13:32                22 python.2019-05-13-13-32-39.log
            2019-05-13  04:55                82 README.md
            2019-05-13  04:44             1,562 Resource.h
            2018-04-10  01:08            46,227 small.ico
            2019-05-13  04:44               630 targetver.h
            2019-05-13  04:57    <DIR>          x64
                          14 File(s)        134,378 bytes
                           3 Dir(s)  ???,???,692,992 bytes free
            

            运行 .bat 脚本的示例快捷方式

            Target 字段:

            C:\batchscript_starter.exe C:\WINDOWS\system32\cmd.exe /C C:\start_wiki.bat
            

            Start in 字段中指定的目录将保存输出文件。

            【讨论】:

              【解决方案16】:

              所以下面的 vbscript 将以隐藏模式启动 cmd/bat 文件。

              strPath = Wscript.ScriptFullName
              Set objFSO = CreateObject("Scripting.FileSystemObject")
              Set objFile = objFSO.GetFile(strPath)
              strFolder = objFSO.GetParentFolderName(objFile)
              
              'MsgBox(strFolder)
              
              Set WshShell = CreateObject("WScript.Shell") 
              WshShell.Run chr(34) & strFolder & "\a.bat" & Chr(34), 0
              Set WshShell = Nothing
              

              现在,只有应用程序窗口可见,而不是 cmd.exe 窗口

              【讨论】:

                【解决方案17】:

                对于那些对肮脏解决方案感到满意的人来说,这是一个简单的解决方法。按win+tab,将bat文件拖拽到新桌面就不用管了。

                我偶尔会制作一个我很少使用的 bat 文件,而不得不使用工具将窗口隐藏起来是一种拖累。这并不比我需要的复杂。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-30
                  • 1970-01-01
                  • 2012-03-12
                  • 1970-01-01
                  • 2022-01-22
                  • 1970-01-01
                  • 2019-05-27
                  相关资源
                  最近更新 更多