隐藏执行另一个.EXE文件的.BAT文件的命令窗口

68

这是一个Windows批处理文件。

这是我的 .bat 文件。

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

"C:\ThirdParty.exe"

这个方法很好用,但是.bat文件在“ThirdParty”应用程序运行的整个时间都会保持命令窗口打开状态。
我需要关闭命令窗口。

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

ThirdParty应用程序不允许用户更改DB源或应用程序服务器。

我们这样做是为了让用户从测试环境切换到生产环境。


1
刚刚发现这个,我认为它非常方便,可以在调用时隐藏控制台窗口: https://www.raymond.cc/blog/hidden-start-runs-batch-files-silently-without-flickering-console/ - Cadoiz
19个回答

53

使用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"

现在第三方应用程序无法启动,我的命令窗口保持打开状态。 - JeffO
是的,你说得对。当我使用它时,我没有引用到我的应用程序路径。请看一下我修改后的答案。 - cg.
1
感谢Patrick Cuff改进我的答案。我还是SO的新手,直到现在才意识到足够的声望可以让你编辑其他人的帖子... - cg.

32

创建一个名为.vbs的文件,并使用以下代码:

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

这个.vbs文件将会隐藏地运行你的your_batch.bat批处理文件。

对我来说运行良好。


1
对于我来说,需要使用 WScript.CreateObject 开始,如果你想通过参数传递,请使用: WScript.CreateObject("Wscript.Shell").Run "your_batch.bat """ & WScript.Arguments.Item(0) & """",0,True - Redzarf

11

使用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"

10

尝试这个:

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

1
不要在"C:\ThirdParty.exe"周围加上引号,这将完美地工作。 - Patrick Cuff
1
这对我有用。没有退出命令,终端保持活动状态。 - Viorel Mirea

9

很好的技巧。它适用于正在运行Java程序的批处理文件。

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

这对我非常有效,但我所要做的就是将“start javaw mainClass”保存到我的.bat文件中,然后它就很好了! - rfoo

5

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


已经实现了类似的解决方案。看起来这个问题是一个很好的地方,可以将它作为额外的答案发布。干杯! - Alex

4

或者您可以使用:

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"。
start命令的/b参数可以实现以下效果:
启动应用程序时不会打开新的命令提示窗口。除非应用程序启用了CTRL+C处理,否则忽略CTRL+C处理。使用CTRL+BREAK来中断应用程序。
这正是我们想要的。

这是最好的答案! - dns

3

我并没有找到一种很好的本地化方法,所以我只是使用一个叫做 hstart 的实用工具来帮助我完成。如果有更好的方法,那就太好了。


HSTART是一个非常优秀的实用工具,可以替代CMD窗口,并且它还可以与PowerShell和Ruby一起使用。 - SteveC

3
你可以创建一个 VBS 脚本来强制隐藏窗口。
Set WshShell = WScript.CreateObject("WScript.Shell")
obj = WshShell.Run("""C:\Program Files (x86)\McKesson\HRS
Distributed\SwE.bat""", 0)
set WshShell = Nothing

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

3
使用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可执行文件源代码链接。 hide-win32-console-window类似于Jamesdlin的silentbatch程序
有一个未解决的问题:当程序窗口不存在时,该怎么处理程序输出?如果发生异常怎么办?抛弃输出不是一个好的解决方案。hide-win32-console-window使用匿名管道将程序的输出重定向到当前目录中创建的文件中。

用法

batchscript_starter.exe full/path/to/application [arguments to pass on]

运行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脚本的示例快捷方式

Shortcut for starting windowless .bat file

目标字段:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接