批处理文件命令 PAUSE 不起作用
Posted
技术标签:
【中文标题】批处理文件命令 PAUSE 不起作用【英文标题】:Batch file command PAUSE does not work 【发布时间】:2011-06-07 15:40:37 【问题描述】:我正在创建一个简单的批处理文件来帮助完成一些事情,并且我还打印了一些说明,我希望用户在退出之前看到这些说明。目前,窗口关闭得非常快。所以我在文件末尾添加了PAUSE
,但它不想工作。
我查看了关于 SO 的其他问题,并检查以确保行尾是 CRLF
并且我在文件末尾有 CRLF
。
有什么建议吗?
【问题讨论】:
你做错了什么。我刚刚又试了一次,对我来说效果很好。 老实说,我不知道为什么,但它今天已经开始工作了。对此我深表歉意,但我不知道发生了什么。我什至没有更改脚本! 【参考方案1】:暂停前的最后一条命令执行成功了吗?介意分享你的脚本 - 至少最后几个命令?
或者,由于您似乎使用的是 Windows7,请尝试使用 Timeout 命令,看看是否有效。
【讨论】:
好吧,如果pause
被调用,它会起作用。使用timeout
不会改变这一点(除了它调用一个单独的程序而不是shell-builtin)。我的猜测是在pause
之前的某处有一个goto :eof
或exit /b
(在带有子例程的批处理文件中并不少见——你不能只在末尾添加命令来执行它们)。
如果最后一个命令抛出异常,你会怎么做,这是我的情况?【参考方案2】:
如果最后一个命令失败,暂停将不起作用。
您可以通过在您正在运行的命令后面加上“调用”来修复它(无论暂停之前的命令是什么),然后暂停就会起作用。
例如,我有一个看起来像这样的 phpunit 批处理文件:
phpunit tests/sometests.php
pause
当 phpunit 失败时,它直接退出而没有暂停。将其更改为此使其正确暂停:
call phpunit tests/sometests.php
pause
【讨论】:
谢谢你,也为我工作。附带说明一下,它似乎不必失败,如果之前的命令中有任何类型的退出代码(即使成功),那么它似乎会关闭窗口。 在以管理员身份运行的 Windows 10 命令提示符下,添加call
对我没有影响。我不知道为什么我的批处理文件(由 AutoHotKey 打开)中的 pause
命令今天突然停止工作。我不知道发生了什么变化。他们已经工作了几个星期。
只是除了蒂姆的回答,如果你想让窗口总是显示,你可以编写 .bat 文件,如: call phpunit tests/sometests.php cmd /k
为了给出更多解释,在 CMD(以及之前的 MS-DOS 中)运行批处理文件会结束当前批处理文件的执行。这意味着,在原始示例中,phpunit
行之后的任何内容都不会运行(即,它与 pause
本身无关)。如果您希望在运行外部批处理文件后继续执行当前批处理文件,则需要按照此答案使用call
命令。【参考方案3】:
我想我知道问题出在哪里,我遇到了同样的问题。因此,如果您这样做,则创建一个新文件并将所有批处理信息放入其中并像普通文本一样保存它,然后重命名扩展名,它将不起作用:)。您必须通过文本编辑器保存它,然后您必须从那里选择“批处理文件(.bat;.cmd;*.nt)”,例如 Notepad++,这可能是因为编码所以这样做就像这样,我想它会好的。 GL! :)
【讨论】:
【参考方案4】:我什至在 echo 上也遇到了问题... 假设它是由长批处理文件引起的...... Pause正在执行但它没有暂停,几乎就像它在Pause执行后按下了一个键。
尝试了上述建议的解决方案;没有工作。
所以只是为了将来参考,这是我所做的:
基本上只是“暂停 > nul && 暂停 > nul”;每次都有效。
@echo off
CALL :ForcePause "Press any key to resume."
ECHO.
ECHO Hello World!
ECHO.
CALL :ForcePause "Press any key to exit."
EXIT
REM You can remove echo if you don't want to pass custom string for pause
:ForcePause
echo %~1
pause > nul && pause > nul
GOTO :EOF
【讨论】:
pause > nul
绝对有效,只是没有给出消息press any key...
在完美世界中当然可以,但就像我提到的那样,它有时不是这个解决方案。【参考方案5】:
除了蒂姆的回答,如果您希望窗口始终显示,您可以编写 .bat 文件,如下所示:
call phpunit tests/sometests.php
cmd /k
【讨论】:
@Marcel 您是否仅仅因为我将其作为答案而不是评论而降低了我的答案? @Marcel 好的,我在原帖中添加了评论,但我的答案也会在这里留下,评论中的代码格式不清楚。 @Justin 我正在使用角度 CLI。ng
cmd /k
【参考方案6】:
我也有同样的问题。出现这种情况有两个原因: 第一个是以管理员身份运行批处理文件。
我已将我的批处理文件移至桌面并以管理员身份尝试,它工作正常。 我已经尝试将批处理文件移动到任何磁盘根目录(如 C:\ D:\ 等)并且它可以正常工作。 我已尝试将批处理文件移动到任何带有空格的目录,并且它可以正常工作。
第二个也是主要原因是:批处理文件的目录中有一些特殊字符(如@或&或类似的东西)。
只需找到此特殊字符并将其从文件夹名称中删除即可。它会正常工作。
【讨论】:
【参考方案7】:我不明白为什么pause
只是在我的脚本中短暂暂停。这里的答案帮助我解决了问题,我终于弄清楚了我的情况发生了什么:
开始 /b
如果您使用start /b
运行应用程序,则应用程序可能会在延迟后将一些输出发送到标准输出。如果在pause
命令运行时出现该输出,它将被解释为击键,并且自然地,脚本将继续。如果您将start /b
与连接到远程计算机的命令一起使用,您肯定会遇到这个问题:
start /b plink pi@192.168.1.100 -pw raspberry "sudo apt-get update"
pause
解决方法是改用pause >nul && pause
【讨论】:
听起来合乎逻辑,但不正确。start /b
在另一个线程中启动一个新实例。主线程不可能查看该线程的输出。【参考方案8】:
仅供参考:上面显示的内容在 Win7 中对我不起作用。 然而,这个 DID 终于奏效了:
PAUSE 0<CON
这也不适用于“超时”。 没有它,它会得到这个:
ERROR: input redirection not supported,...
有了它,它得到了这个:
ERROR: The handle is invalid.
就我而言,这是在这样做之后发生的:
start /WAIT cmd.exe /V:ON /k "set IEdir & pushd %IEdir% & cd & call "C:\Program Files\Internet Explorer\iexplore.exe" & set XsetRC1=!errorlevel! & set Xset & echo Xrc1=!XsetRC1! & popd & timeout /T 3 & EXIT !XsetRC1!"
其中 IE 返回 RC=1(KILL 也会得到什么)。
但是,对 FireFox 和 Thunderbird 执行完全相同的操作:
start /WAIT cmd.exe /V:ON /k "set FFdir & pushd %FFdir% & cd & call "C:\FireFox\FireFox.exe" & set XsetRC1=!errorlevel! & set Xset & echo Xrc1=!XsetRC1! & popd & timeout /T 3 & EXIT !XsetRC1!"
如果 FF 和 TB 返回 RC=0,则“超时”确实可以正常工作。
还要注意,在 Win10 中 PAUSE 不会失败。
【讨论】:
以上是关于批处理文件命令 PAUSE 不起作用的主要内容,如果未能解决你的问题,请参考以下文章