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

时间:2015-01-27 17:52:40

标签: windows powershell batch-file cmd

信不信由你,我已经搜遍了所有的stackoverflow和谷歌,并且无法找到适合我的答案。

(Windows 7 64位)我试图创建一个一次运行多个程序的批处理文件。简单吧?它运行第一个.exe程序之前一切正常。在.exe程序的GUI关闭后,批处理文件/ cmd窗口也会关闭。我不希望它关闭;我想要运行批处理文件的其余部分。

在批处理文件中,我尝试了以下方法,但没有一种方法阻止批处理文件关闭:

  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
  8. 有谁知道我可以尝试的另一种方法?也许我应该只调用一个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种命令形式,但脚本在到达下一个{{{0}之前始终关闭1}}命令。我还尝试使用以下建议中的pausecmd.exe /c,但不幸的是,脚本在到达cmd.exe /k命令之前仍然退出。

    修改

    我想出了问题(虽然不是如何修复它)。如果我删除这些行:

    pause

    以便以下命令在同一个批处理标签下,它可以工作!但我不确定为什么包含GOTO CheckOS :CheckOS IF EXIST "%PROGRAMFILES(X86)%" (GOTO 64BIT) ELSE (GOTO 32BIT) :32BIT 标签会导致其中断。我以前在其他批处理脚本中使用过此标签,并且工作正常。

    没关系,抱歉。 :S仅在程序已经运行时才有效。如果已经运行,则修改,修复或删除"屏幕弹出而不是"安装"屏幕。显然只有"安装"屏幕关闭:CheckOS窗口。

    最终编辑

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

1 个答案:

答案 0 :(得分: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.