如何在程序启动后在不打开控制台的情况下从批处理文件运行程序?

Posted

技术标签:

【中文标题】如何在程序启动后在不打开控制台的情况下从批处理文件运行程序?【英文标题】:How can I run a program from a batch file without leaving the console open after the program starts? 【发布时间】:2010-09-24 09:12:37 【问题描述】:

目前我的批处理文件如下所示:

myprogram.exe param1

程序启动,但 DOS 窗口仍然打开。如何关闭它?

【问题讨论】:

您可能应该将接受的答案更改为 Marshall 发布的答案。 【参考方案1】:

您可以使用 exit 关键字。这是我的一个批处理文件中的一个示例:

start myProgram.exe param1
exit

【讨论】:

请注意,如果您以交互方式使用控制台而不是仅仅双击批处理文件,这将不是一件好事。通常几乎不需要将exit 放入批处理文件中。 我在 Win8 中试过这个命令。我不确定它是否不同,但请注意,您必须为其提供 Window 标题作为您的第一个参数。当我按照 Patrick 描述的方式运行它时,它只会打开一个新的命令提示符,窗口标题为“myProgram.exe”:start "***" "C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\***ui.exe" 请注意,如果您的命令包含空格并将其放在引号中,则必须在其前面添加一个额外的带引号的参数,因为 START 将第一个带引号的参数解释为窗口名称,并且仅将以下第二个参数解释为命令名字。【参考方案2】:

看START命令,可以这样操作:

START rest-of-your-program-name

例如,这个批处理文件将等到记事本退出:

@echo off
notepad c:\test.txt

但是,这不会:

@echo off
start notepad c:\test.txt

【讨论】:

【参考方案3】:

你应该试试这个。它启动没有窗口的程序。它实际上闪烁了一秒钟,但很快就消失了。

start "name" /B myprogram.exe param1

【讨论】:

"title" 选项很重要。如果程序路径包含空格,则必须用引号括起来,因此我们必须添加"title" 以避免失败。 如果关闭主窗口,后台进程“myprogram.exe”也会关闭。【参考方案4】:

来自我的own question:

start /b myProgram.exe params...

如果您从现有的 DOS 会话启动程序,则可以工作。

如果没有,调用vb脚本

wscript.exe invis.vbs myProgram.exe %*

Windows Script Host Run() method 需要:

intWindowStyle : 0 表示“不可见的窗口” bWaitOnReturn : false 表示您的第一个脚本不需要等待您的第二个脚本完成

这里是 invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

【讨论】:

+1 肯定有更简单的方法,但这是唯一对我有用的答案。 谢谢 - /b 标志正是我想要的。【参考方案5】:

我从 GUI 执行此操作的解决方案:

    为要运行的程序创建快捷方式;

    编辑快捷方式的属性;

    TARGET字段更改为%COMSPEC% /C "START "" "PROGRAMNAME""

    RUN 字段更改为最小化。

准备好了!看看你喜欢它...

PS:程序参数可以在最后两个引号之间插入; PROGRAMNAME 字符串可以是文件名、相对路径或绝对路径——如果您输入绝对路径并擦除驱动器号和分号,那么无论主机分配什么字母,这都可以在拇指驱动器中使用它...(另外,如果您将快捷方式放在同一个文件夹中并在PROGRAMNAME 中的程序文​​件名之前加上%CD% 变量,路径将始终匹配;同样的技巧可以在START IN 字段中使用)。

【讨论】:

【参考方案6】:

当我尝试从批处理文件运行 java 类时,这是唯一对我有用的东西:

start "cmdWindowTitle" /B "javaw" -cp . testprojectpak.MainForm

您可以按照正确的语法为您的项目自定义start 命令:

Syntax
      START "title" [/Dpath] [options] "command" [parameters]

Key:
   title      : Text for the CMD window title bar (required)
   path       : Starting directory
   command    : The command, batch file or executable program to run
   parameters : The parameters passed to the command

Options:
   /MIN       : Minimized
   /MAX       : Maximized
   /WAIT      : Start application and wait for it to terminate
   /LOW       : Use IDLE priority class
   /NORMAL    : Use NORMAL priority class
   /HIGH      : Use HIGH priority class
   /REALTIME  : Use REALTIME priority class

   /B         : Start application without creating a new window. In this case
                ^C will be ignored - leaving ^Break as the only way to 
                interrupt the application
   /I         : Ignore any changes to the current environment.

   Options for 16-bit WINDOWS programs only

   /SEPARATE   Start in separate memory space (more robust)
   /SHARED     Start in shared memory space (default)

【讨论】:

【参考方案7】:

使用启动命令防止批处理文件等待程序。只要记住在“开始”之后要运行的程序前面加上一个空的双引号。 例如,如果您想通过批处理命令运行 Visual Studio 2012:

Start ""  "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe"

注意开始后的双引号。

【讨论】:

@SharkAlley 正确的格式是start &lt;window name&gt; &lt;program name&gt; 这是正确答案。谢谢,空的双引号正是我所需要的。 我有一个备份脚本,我每周运行一次,每周都会稍微修改它,试图让它 a) 关闭我的程序,b) 备份我的数据,c) 重新启动程序并关闭命令提示符。这终于让命令提示符关闭(也阻止了我的下一次备份触发,我不得不关闭该命令提示符!!!)。 @NobleUplift:对我来说这行得通,.. 下面是确切的行, Start "" "C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.2.5\bin\idea64.exe " &【参考方案8】:

如果您希望按计划或始终运行此批处理文件;您可以使用 Windows 计划工具,它在启动批处理文件时不会在窗口中打开。

打开Task Scheduler:

开始 -> 运行/搜索 -> 'cmd' 输入taskschd.msc -> 回车

从右侧点击Create Basic Task 并按照菜单进行操作。

希望这会有所帮助。

【讨论】:

【参考方案9】:

如何解决“空间问题”和本地依赖:

@echo off
cd "C:\Program Files\HeidiSQL"
start heidisql.exe

cd "C:\Program Files (x86)\Google\Chrome\Application"
start chrome.exe

exit

【讨论】:

这不是问题的答案 是的,但我认为它提供了一个很好的解决方案,可以解决我遇到的其他问题。 是我的解决方案。 Dos 窗口打开但又关闭,解决方案有效。我不明白反对票(我赞成) 我要么。解决方案有效,并解决问题【参考方案10】:

这是我的首选解决方案。它取自answer 到一个类似的问题。

使用 VBS 脚本调用批处理文件:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\path\to\your\batchfile.bat" & Chr(34), 0
Set WshShell = Nothing

将以上行复制到编辑器并使用 .VBS 扩展名保存文件。

【讨论】:

【参考方案11】:

这个问题已经有很多答案了,但我发布这个是为了澄清一些重要的事情,尽管情况可能并非总是如此:

Start "C:\Program Files\someprog.exe"

在某些 Windows 版本中可能会导致问题,因为 Start 实际上期望第一组引号是 Windows 标题。因此,最佳做法是先对评论或空白评论进行双引号:

Start "" "C:\Program Files\someprog.exe"

Start "Window Title" "C:\Program Files\someprog.exe"

【讨论】:

这让我很开心。现在它实际上可以工作了,否则它只会在尝试使用 exe 打开文件时给我打开方式对话框。

以上是关于如何在程序启动后在不打开控制台的情况下从批处理文件运行程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不打开的情况下从 CSV 文件中检索数据

如何在不打开电子邮件应用程序的情况下从锚标签中抓取电子邮件 ID

在 Android 11 上,如何在不实际点击通知的情况下从通知更新启动 Activity

android:在不使用 pdf 查看器的情况下从我的应用程序打开 pdf

如何在不点击通知的情况下从通知中获取数据(firebase 云消息传递和本机反应)

如何在不知道个人资料 ID 的情况下从我的应用打开 LinkedIn 应用?