【问题标题】:How do I call a batch file from a batch file without creating a new window?如何在不创建新窗口的情况下从批处理文件调用批处理文件?
【发布时间】:2018-03-02 10:43:14
【问题描述】:

我需要处理一些音频文件。每个文件都必须经过多个顺序步骤,为此我编写了一个批处理文件。但为了速度,我希望并行处理文件夹中的所有文件。所以我写了另一个批处理文件,它在循环中调用第一个批处理文件。但是当我这样做时,我最终会得到多个命令窗口,即使批处理文件已关闭,这些窗口也会保持打开状态。

按照优先顺序,我怎样才能(a)根本不打开窗口,或者(b)最小化窗口然后在完成时关闭;或 (c) 打开窗口,完成后关闭。

for %%I in (*.mp3) DO (
    start convert-mp3-to-m4b.bat "%%I"
)

我通过start cmd /c convert-mp3-to-m4b.bat "%%I" /B 成功实现了 (c),但这更多是靠运气而不是判断。

【问题讨论】:

  • 你在问答案 - 使用 CALL 关键字:call convert-mp3-to-m4b.bat "%%I"
  • 还要检查bat是否直接使用EXIT命令,改成exit /b
  • @npocmaka call 不会并行运行进程...
  • 然后start "" /b convert-mp3-to-m4b.bat "%%I"
  • start /min 以最小化运行它们。注意:如果您的.mp3 太多,您的计算机可能会耗尽资源。请参阅 here 以一次运行最多 <n> 个文件。

标签: windows batch-file


【解决方案1】:

在@Stephan 的帮助下,我得到了这个结果:

for %%Z in (*.mp3) DO (
    start "converting-audio" /min cmd /c convert-mp3-to-m4b.bat "%%Z"
)

这会启动最小化的窗口,并在处理后关闭它们。我也很高兴max <n> 技巧,尽管我不得不稍微修改一下代码。如果它对其他人有帮助,我的脚本现在看起来像这样:

@echo off
setlocal enabledelayedexpansion
set count=0
set max=4
for %%Z in (*.mp3) DO (
    call :loop
    start "converting-audio" /min cmd /c convert-mp3-to-m4b.bat "%%Z"
)

goto :eof    

:loop
for /f "tokens=* USEBACKQ" %%G IN (`tasklist /fi "windowtitle eq converting-audio" ^| find "cmd.exe" /C`) do ( SET "count=%%G" )
if !count! GEQ !max! call :loop

这一次处理四个文件,效果很好。

【讨论】:

  • 看起来不错。而不是 START /MIN 我认为您最好使用 START /B 与 stdout 和 stderr 重定向到 NUL。
猜你喜欢
  • 1970-01-01
  • 2012-06-19
  • 2015-04-15
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多