如何在发生错误时防止批处理窗口关闭?

64

我正在尝试编写批处理脚本,如果文件夹不存在则创建。 根据在线示例,以下是我的脚本。

问题在于;第一个pause有效,然后由于语法错误,窗口关闭甚至在到达第二个pause之前,因此我无法确定我的脚本哪里出错了。

有人能告诉我如何防止关闭窗口,以便我可以看到窗口上的内容吗?

@echo off

:copy theme images over
:designer
echo copying theme images over...
pause
if not exist "%K2DIR%\K2 SmartForms Runtime\Styles\Themes\Sharepoint 2013\rich_text"
(
    md "%K2DIR%\K2 SmartForms Runtime\Styles\Themes\Sharepoint 2013\rich_text333"
)

pause

7
为什么你不在md之前加一个“暂停(pause)”呢?同时,不要直接双击运行.bat文件:打开cmd并从那里调用你的批处理文件。那样就没有窗口需要关闭了! - Sebastian
6
关于语法错误,你的 ( 位置错误了。它必须放在与 IF 语句同一行,并在其前留有一个空格。 - dbenham
6个回答

81

你可以将这行代码放在批处理文件开头:

if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )

这行代码的作用是,在第一次运行时,它会在一个子进程中重新启动自己,该进程在运行完批处理文件后不会退出。


这在Windows 7中似乎不起作用。它会生成递归子进程,直到某些东西失败。有人有任何更正吗? - Bodey Baker
4
@porcoesphino 你可以尝试使用以下命令:if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )。该命令的意思是,如果当前没有定义名为in_subprocess的变量,则执行命令"cmd /k set in_subprocess=y ^& %0 %*",其中^&表示在同一行上执行两个命令,并将当前脚本和任何传递的参数作为参数传递给%0 %*。最后使用"exit"命令退出脚本。 - Klitos Kyriacou
哦,哇。括号前的空格是问题所在。早期版本也可以这样吗?如果是这样,更新您的答案可能是值得的。谢谢。 - Bodey Baker
@porcoesphino 命令提示符(cmd)总是让我惊喜不断。实际上,我应该说cmd一直揭示新的怪癖,所以它再也不会让我感到惊讶了。我马上会更新我的答案。 - Klitos Kyriacou
“defined”未被识别为内部或外部命令?我不知道win7上出了什么问题。 - SLdragon
显示剩余2条评论

43
你需要向CMD传递/K开关,或者打开一个命令窗口并从命令行运行批处理文件。

4
命令:cmd /k myfile.bat 翻译:打开命令提示符并运行 myfile.bat 文件,执行完毕后命令提示符窗口保持打开状态。 - Diego Vieira
在我的情况下,我需要这个来调试一个Nuitka构建,并且这给了我一个提示。.\app.exe - 3V1LXD
我尝试按如下方式使用:cmd /k env\Scripts\activate && python fedex_main.py --mode "draft" && pause - 但似乎不起作用。我可以通过创建一个新的*.bat文件来使其工作,例如python_env_file.bat,其中包含env\Scripts\activate && python fedex_main.py --mode "draft" && pause部分,然后在单独的调用中使用cmd /k python_env_file.bat - 但与将所有内容放在1个文件中相比,这似乎过于复杂? - mfcss

9

点击 开始,输入 cmd, 然后按下 enter,就会启动命令提示符窗口。

将需要运行的内容(例如Python脚本、.exe文件等)拖放到命令提示符窗口中,然后按下回车键。

(有时您需要以管理员身份运行cmd:在开始菜单中找到cmd,在其上单击右键,选择 以管理员身份运行)。


这太容易了。无需修改我的脚本,它会显示最后失败的行。感谢您的建议! - gamingexpert13
1
今日新知:在CMD窗口中拖放功能是可行的。这是一个很好的时间节省技巧,谢谢! - TimHayes

1

我使用录屏软件(bandicam)录制了屏幕,以便在无法完全阅读错误消息时进行回放;如果您的计算机上已经安装了该软件,这可能会非常有帮助。


1
这对我来说非常有效!那是一个短暂的消息,我无法控制脚本调用 - 这是最好的选择。 - N K

1

在批处理结束时使用pause命令会暂停cmd窗口,谢谢!


0
如何在出现错误时防止批处理窗口关闭?
我在使用robocopy时遇到了这个问题。我的解决方案是:
if not %errorlevel% lss 8 pause

对于Robocopy,小于8的每个退出代码都表示成功: https://ss64.com/nt/robocopy-exit.html


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