【问题标题】:Call to several batch files through CMD doesn't block通过 CMD 调用多个批处理文件不会阻塞
【发布时间】:2017-10-09 11:18:38
【问题描述】:

我正在尝试使用 Python 槽 CMD 一个接一个地调用几个 install.bat 文件。

每个 bat 文件都必须显示在交互式控制台窗口中,因为它要求一些用户指令,并且 python 程序只有在每个 CMD 进程解决后才能恢复 每个 install.bat 文件都可能需要很长时间才能完成其进程。

我的代码如下:

for game in games :
    print("----------- Starting conversion for %s -----------" %game)       
    subprocess.call("start cmd /C " + "Install.bat", cwd=os.path.join(gamesDosDir,game), shell=True)        

print("end")   

但是外壳内的控制台窗口是一次性启动的,并且“结束”消息会在它们中的任何一个完成之前出现事件,而我希望它们一个接一个地出现,直到 n+1 一个n 一个完成并关闭控制台窗口(由用户或自动 /K 或 /C 然后)。

我知道这是使用 CMD 的一些问题,因为调用应该被阻塞。如何解决?此外,如果可能的话,如何保持完全相同并添加“Y”和“Y”作为默认用户输入?

【问题讨论】:

  • 您不需要使用Start 命令,如果没有/wait 选项,这是主要问题。当脚本无论如何都应该在其默认解释器中自动运行时,我也觉得奇怪的是,以脚本作为参数运行cmd.exe
  • 尝试使用批处理文件的完整绝对路径并加上引号,并删除start:'cmd /C "D:\Scripts\Install.bat"',例如...
  • @Compo 很好,我试着这样做,但我不知道
  • @aschipfl 如果 bat 文件不是从它的目录中运行,它就不起作用,因为它可能使用相对路径
  • 使用 "subprocess.call("cmd /C Install.bat", cwd=os.path.join(gamesDosDir,game), shell=True)" 命令阻塞但我看不到cmd 窗口,然后输入它正在等待的输入,它会永远阻塞

标签: python windows batch-file cmd windows-console


【解决方案1】:

如果将批处理文件作为参数传递给cmd /c,这是启动批处理文件(或更一般地说是 CLI 命令)的最常见方式。在您发表评论后,我可以假设您需要使用 start 来强制创建(新)命令窗口。

在这种情况下,正确的方法是在启动命令中添加/wait 选项:它将强制启动命令等待其子进程结束:

subprocess.call("start /W cmd /C " + "Install.bat", cwd=os.path.join(gamesDosDir,game),
    shell=True)

但是@eryksun 提出了一种更清洁的方法。在 Windows 上,.bat 文件可以在没有shell = True 的情况下执行,creationflags=CREATE_NEW_CONSOLE 足以确保创建一个新的控制台。所以上面一行可以简单地变成:

subprocess.call("Install.bat", cwd=os.path.join(gamesDosDir,game),
    creationflags = subprocess.CREATE_NEW_CONSOLE)

【讨论】:

  • 由于他们在 Start 命令的参数中使用双引号,因此他们至少需要使用空白标题 Start "" /W
  • @Compo:当然可以。如果他们不这样做,他们只会得到默认标题C:\Windows\system32\cmd.exe...
  • 好吧,因为@aschifpl 在你面前给出了很好的解决方案,但显然不想输入回复我给你绿色检查
  • 您正在运行 'cmd /c "start cmd /c install.bat"',这会创建一个不必要的 cmd.exe 进程和两个控制台,其中一个控制台隐藏为 shell=True 的默认行为。相反,直接使用其完全限定路径运行批处理文件,而不使用shell=True。如果您已经连接到控制台并想要一个新的,请使用creationflags=CREATE_NEW_CONSOLE
  • @eryksun:谢谢!我以前从未使用过 creationflags ......我已经编辑了我的答案,因为你的解决方案更干净。
猜你喜欢
  • 2015-08-16
  • 2013-08-12
  • 2021-12-19
  • 2011-12-30
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多