禁用Windows bat脚本中的“暂停”

9
在Windows中,我正在运行一个.bat脚本,它目前以'pause'结尾并提示用户“按任意键继续...” 我无法在此情况下编辑文件,需要脚本终止而不是挂起等待永远不会到来的输入。有没有一种方法可以运行这个脚本以禁用或规避提示?我已经尝试过输入管道,但似乎没有帮助。此脚本通过subprocess.Popen从python运行。

我相信pause是内置于cmd解释器中的命令,因此无法替换它。否则,您可以创建一个pause.exe并将其放在路径的前面。 - Mark Ransom
我不明白为什么管道输入不起作用,你可以从命令行重定向:pause <nul - Mark Ransom
4个回答

18

尝试执行 cmd.exe /c YourCmdFile < nul

YourCmdFile - 您的批处理脚本的完整路径


1
+1,但是没有必要使用cmd.exe。直接执行脚本:script.bat <nul。它也可以作为快捷方式工作。 - dbenham
我建议使用'cmd /c',因为“此脚本是通过subprocess.Popen从Python运行的”。不确定Python如何执行脚本。 - Maximus
但是如果我尝试使用 "cd dir & script.bat args < null",它会显示找不到文件。如果没有 "< null",就可以正常运行。 - kilasuelika
Use double quotes around - Maximus
在cmd中,"nul"只有一个"L"。 - Maximus

5
subprocess.call("mybat.bat", stdin=subprocess.DEVNULL)

在Windows系统下,可以通过调用mybat.bat并将输入重定向到nul来禁用暂停(与其他答案中所示的方法相同)。


1
请注意,此代码仅适用于Python 3。在Python 2.x中,您需要获取一个文件句柄来处理devnull(例如devnull = open(os.devnull,'r')),然后将其作为stdin传递。 - Brent Writes Code
@BrentNash 很好的发现。我最终使用了你的代码来实现Python2/3兼容性。在完成后记得关闭文件,以避免资源泄漏(这种情况下Python 3会发出警告)。 - Bryce Guinta

4
这个有点棘手。从Maximus的nul重定向方案来看,效果不错,谢谢!在Python中让它正常工作的关键是以下步骤。首先,在开始时使用了:
BINARY = "C:/Program Files/foo/bar.exe"
subprocess.call([BINARY])

尝试添加重定向,但 subprocess.call 对所有内容都进行了转义,导致我们失去了重定向。
subprocess.call([BINARY + " < nul"])
subprocess.call([BINARY, " < nul"])
subprocess.call([BINARY, "<", "nul"])

使用shell=True无法正常工作,因为BINARY中的空格使其在尝试查找可执行文件时出现问题。

subprocess.call([BINARY + " < nul"], shell=True)

最终,我不得不回到os.system并进行转义,以获得重定向。
os.system(quote(BINARY) + " < nul")

虽然不是最理想的方法,但它可以完成工作。

如果有人知道如何使最后一个子进程示例在二进制文件中包含空格的情况下正常工作,将不胜感激!


0

对我来说,以下代码有效:

p = Popen("c:\script.bat <nul", cwd="c:\")

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