防止批处理文件在执行外部 .exe 程序后关闭

Prevent batch file from closing after it executes an external .exe program

信不信由你,我已经搜索了整个 Whosebug 和 Google,但找不到适合我的答案。

(Windows 7 64 位) 我正在尝试创建一个批处理文件,其中 运行 多个程序,一次一个。简单吧?在 运行 成为第一个 .exe 程序之前,它一直很好用。 .exe 程序的 GUI 关闭后,批处理 file/cmd window 也会关闭。我不希望它关闭;我希望批处理文件的其余部分为 运行.

在批处理文件中,我尝试了以下方法,但其中 none 阻止了批处理文件的关闭:

  1. Git-1.9.5-preview20141217.exe
  2. Git-1.9.5-preview20141217.exe
    pause
  3. call Git-1.9.5-preview20141217.exe
    pause
  4. start Git-1.9.5-preview20141217.exe
    pause
  5. start "" /wait Git-1.9.5-preview20141217.exe
    pause
  6. start "" /w Git-1.9.5-preview20141217.exe
    pause
  7. start "" /w /b Git-1.9.5-preview20141217.exe
    pause

有人知道我可以尝试的另一种方法吗?也许我应该只调用 powershell 命令,甚至将整个批处理文件转换为 powershell,但我试图避免使用 powershell,以便该脚本可以在 Windows.

的多个版本上运行

编辑

我还应该提到,使用上述方法,脚本会在 之前关闭,pause 命令可以执行。

编辑

这是包含 .exe 程序其余部分的完整脚本:

:Git
@echo off
(
echo.
echo.
echo DOWNLOADING GIT...
)
powershell -Command "(New-Object Net.WebClient).DownloadFile('http://github.com/msysgit/msysgit/releases/download/Git-1.9.5-preview20141217/Git-1.9.5-preview20141217.exe', 'Git-1.9.5-preview20141217.exe')"
(
echo.
echo.
echo LAUNCHING GIT INSTALLATION PROGRAM...
echo.
echo !IMPORTANT! WHEN YOU REACH THE SCREEN 'Adjusting your PATH environment',
echo SELECT 'Use Git from the Windows Command Prompt'.
echo KEEP ALL OTHER OPTIONS AT THE DEFAULT SETTING.
echo.
echo AFTER READING THE INSTRUCTIONS ABOVE, PRESS ANY KEY TO CONTINUE
)
pause
Git-1.9.5-preview20141217.exe
pause
GOTO CheckOS

:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)

:32BIT
(
echo.
echo.
echo 32 BIT
echo.
echo DOWNLOADING TORTOISEHG (MERCURIAL)...
)
powershell -Command "(New-Object Net.WebClient).DownloadFile('http://bitbucket.org/tortoisehg/files/downloads/tortoisehg-3.2.4-x86.msi', 'tortoisehg-3.2.4-x86.msi')"
(
echo.
echo.
echo LAUNCHING TORTOISEHG INSTALLATION PROGRAM...
)
tortoisehg-3.2.4-x86.msi
GOTO MingW

:64BIT
(
echo.
echo.
echo 64 BIT
echo.
echo DOWNLOADING TORTOISEHG (MERCURIAL)...
)
powershell -Command "(New-Object Net.WebClient).DownloadFile('http://bitbucket.org/tortoisehg/files/downloads/tortoisehg-3.2.4-x64.msi', 'tortoisehg-3.2.4-x64.msi')"
(
echo.
echo.
echo LAUNCHING TORTOISEHG INSTALLATION PROGRAM...
)
tortoisehg-3.2.4-x64.msi
GOTO MingW

:MingW
(
echo.
echo.
echo DOWNLOADING MINGW...
)
powershell -Command "(New-Object Net.WebClient).DownloadFile('http://downloads.sourceforge.net/project/mingwbuilds/mingw-builds-install/mingw-builds-install.exe?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmingwbuilds%2F%3Fsource%3Dtyp_redirect&ts=1422376004&use_mirror=iweb', 'mingw-builds-install.exe')"
(
echo.
echo.
echo LAUNCHING MINGW INSTALLATION PROGRAM...
)
mingw-builds-install.exe
(
echo.
echo.
echo DONE! PRESS ANY KEY TO CLOSE.
)
pause
GOTO END

:END

对于 运行 外部 .exe 程序的行,我已经尝试了这个问题开头列出的所有 7 种命令形式,但脚本总是在到达之前关闭下一个 pause 命令。我也尝试使用以下建议中的 cmd.exe /ccmd.exe /k,但不幸的是脚本仍然在到达 pause 命令之前退出。

编辑

我找到了问题所在(虽然不知道如何解决)。如果我删除这些行:

GOTO CheckOS

:CheckOS
IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT)

:32BIT

让后面的命令在同一个批次标签下,成功了!但我不确定为什么包含 :CheckOS 标签会导致它损坏。我以前在其他批处理脚本中使用过这个标签,它们工作正常。

没关系,对不起。 :S 这仅在程序已经 运行 时有效。如果它已经 运行,则会弹出“修改、修复或删除”屏幕,而不是“安装”屏幕。显然只有“安装”屏幕会关闭 cmd.exe window.

最终编辑

括号是问题所在。删除它们后,其他一切正常。此问题开头的方法编号 1 在删除括号后有效。

尝试在新文件中打开可执行文件 shell:

@echo off
cmd.exe /c Git-1.9.5-preview20141217.exe
echo Still here.

/c 开关告诉(新)shell 在程序终止时关闭。批处理脚本的执行将暂停到那时。

例如:

@echo off
echo New window.
cmd.exe /c %WINDIR%\system32\notepad.exe
echo Window still open.
cmd.exe /c %WINDIR%\system32\notepad.exe
echo Window closed. You won't see this.