如何从批处理文件中运行命令并立即返回?

6
当我在命令行上执行以下操作时:

"C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe" /command:log

打开TortoiseGit的GUI对话框后,cmd.exe会立即返回,这意味着我可以立即运行其他命令,如dir等。
由于上述命令相当冗长,因此我创建了一个辅助批处理文件tgit.cmd,其中只包含以下内容:
@echo off
"C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe" /command:%1 %*

我现在可以直接调用 tgit log,这非常好,但是有一个区别:命令行会被阻塞,直到我关闭 TortoiseGit 对话框。
我也尝试过。
cmd /C "C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe" /command:%1 %*

但这并不重要。如何立即从批处理文件返回?

我认为start命令不是我要找的 - 它会返回一个错误,如下所示,并且其任务是在一个新的控制台窗口中启动一个程序,这并不是我的意图。 - Borek Bernard
2个回答

12

Oscar的回答几乎正确,但需要更正。

start "" "C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe" /command:%1 %*

为什么?

start 命令有一种奇怪的行为:第一个带引号的参数用于确定新的 cmd 窗口的标题,没错,即使不会启动任何 cmd 窗口也是如此。第一个带引号的参数就是窗口的标题。

这就是前面代码中出现空双引号的原因。如果没有它,start 命令看到的内容将是:

start "title=c:\Progra..." /command:....

由于start命令不包括/command开关,因此它会失败。


这个可以工作!你能否请解释一下为什么 cmd /C ... 不行呢?从描述上看,它似乎是一个更合适的命令。 - Borek Bernard
1
@Borek,“cmd /c”在当前控制台内启动了一个新进程。当新的“cmd”结束时,之前的实例将再次获得控制权。 - MC ND
明白了,但是 TortoiseGitProc.exe /command: 执行起来大约需要100毫秒(至少在cmd.exe中手动输入时是这样),所以我不太明白为什么从批处理文件运行时会阻塞CLI。或者反过来 - 为什么手动输入此命令时CLI没有被阻塞.. 在我看来很奇怪。 - Borek Bernard
2
@Borek,这是标准行为。有两种类型的应用程序,控制台和GUI。从命令行,控制台应用程序会阻塞,而GUI不会阻塞。从批处理文件中,两者都会阻塞。请参见start /? - MC ND
谢谢,这是一个非常重要的区别。 - Borek Bernard

0

使用 START 命令来运行程序。

start "C:\Program Files\TortoiseGit\bin\TortoiseGitProc.exe" "/command:log"

尝试在整个内容周围添加引号,但也没有帮助。我认为“start”不是我要找的东西。 - Borek Bernard
将参数放在引号内。我已经编辑了我的答案。 - Oscar
很抱歉,那样做是行不通的 - 它会打开一个新的控制台窗口,这与直接使用一些参数运行TortoseGitProc.exe的行为不同。 - Borek Bernard
@Borek,START命令正是你所要求的。它可以“允许用户从Windows命令行启动一个单独的窗口”。也许你应该更好地阐述你的问题。 - Oscar
我建议你尝试安装TortoiseGit并自己尝试。我询问了关于运行TortoiseGitProc.exe命令的问题,该命令会打开一个GUI窗口(而不是新的命令窗口),以及如何将在命令行上正常工作的行移动到批处理文件中,在那里它似乎会阻塞CLI。如果有什么问题,CMD命令(http://ss64.com/nt/cmd.html)似乎是我需要的,但出于某种原因也无法正常工作。 - Borek Bernard
@Borek 不好意思,你的问题是:“如何从批处理文件中运行命令并立即返回?”没有提到任何GUI。实际上,在批处理中没有GUI。祝你好运。 - Oscar

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