Windows 7 批处理文件命令暂停不起作用

Windows 7 批处理文件命令暂停不起作用,windows-7,batch-file,Windows 7,Batch File,我正在创建一个简单的批处理文件来帮助做一些事情,我有一些指示,它也打印出来,我希望用户在退出之前看到。目前,窗口关闭得非常快。因此,我在文件末尾添加了PAUSE,但它不想工作 我查看了SO上的其他问题,并进行了检查,以确保行结尾为CRLF,并且我在文件末尾有CRLF 有什么建议吗?暂停前的最后一个命令是否成功执行?介意分享你的脚本吗?至少是最后几个命令 或者,由于您似乎正在使用Windows7,请尝试使用Timeout命令,看看它是否有效。如果最后一个命令失败,则暂停将不起作用 您可以通过将“c

我正在创建一个简单的批处理文件来帮助做一些事情,我有一些指示,它也打印出来,我希望用户在退出之前看到。目前,窗口关闭得非常快。因此,我在文件末尾添加了
PAUSE
,但它不想工作

我查看了SO上的其他问题,并进行了检查,以确保行结尾为
CRLF
,并且我在文件末尾有
CRLF


有什么建议吗?

暂停前的最后一个命令是否成功执行?介意分享你的脚本吗?至少是最后几个命令


或者,由于您似乎正在使用Windows7,请尝试使用Timeout命令,看看它是否有效。

如果最后一个命令失败,则暂停将不起作用

您可以通过将“call”放在正在运行的命令后面(暂停之前的任何命令)来修复此问题,然后暂停将起作用

例如,我有一个phpunit批处理文件,如下所示:

phpunit tests/sometests.php
pause
当phpunit失败时,它没有暂停就退出了。将其更改为此可使其正确暂停:

call phpunit tests/sometests.php
pause

我想我知道问题在哪里,我也有同样的问题。因此,如果您这样做,您将创建一个新文件,并将所有批处理信息放入其中,然后像普通文本一样保存,然后重命名扩展名,它将不起作用:)。您必须通过文本编辑器保存它,然后从中选择“批处理文件(.bat;.cmd;*.nt)”,例如Notepad++,这可能是因为编码的缘故,所以请这样做,我认为这样就可以了。德国劳埃德船级社!:)

我甚至在echo上也有问题。。。 假设它是由长批处理文件引起的。。。暂停正在执行,但它不是暂停,它几乎就像是在暂停执行后按下一个键

尝试上述建议的解决方案;没有一个奏效

因此,仅供将来参考,以下是我所做的:

基本上就是“暂停>nul&&pause>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

除了Tim的回答之外,如果希望窗口始终显示,可以编写.bat文件,如下所示:

call phpunit tests/sometests.php
cmd /k

我也有同样的问题。出现这种情况有两个原因:
第一个是以管理员身份运行批处理文件时

我已将批处理文件移动到桌面,并以管理员身份尝试,效果良好。
我已尝试将批处理文件移动到任何磁盘根目录(如C:\D:\等),它工作正常。
我已尝试将批处理文件移动到任何带有空格的目录,并且它工作正常。

第二个也是主要的原因是:批处理文件的目录中有一些特殊字符(如@or&或类似的字符)


只需找到此特殊字符并将其从文件夹名称中删除即可。它会正常工作。

我不明白为什么
暂停
只是在我的脚本中短暂暂停。这里的答案帮助我解决了这个问题,我终于明白了我的情况:

开始/b 如果使用
start/b
运行应用程序,则应用程序可能会在延迟后向stdout发送一些输出。如果在运行
pause
命令时出现该输出,则会将其解释为击键,脚本自然会继续。如果将
start/b
与连接到远程计算机的命令一起使用,您肯定会遇到此问题:

start /b plink pi@192.168.1.100 -pw raspberry "sudo apt-get update"
pause

解决方法是使用
pause>nul&&pause
而不是您在做其他错误的事情。我只是试了一次,它对我来说非常好。我真的不知道为什么,但它今天就开始工作了。对此我深表歉意,但我不知道发生了什么。我甚至没有改变剧本!嗯,如果调用了
pause
,它就会工作。改用
timeout
不会改变这一点(除非它调用的是一个单独的程序,而不是shell内置程序)。我的猜测是,在
暂停
之前的某个地方有一个
goto:eof
exit/b
(在带有子例程的批处理文件中并不少见–在这些文件中,您不能只在末尾添加命令来执行它们)。如果最后一个命令引发异常,您会怎么做,这就是我的情况?谢谢,这也为我工作了。另一方面,它似乎不必失败,如果之前的命令中包含任何类型的退出代码(即使成功),那么它似乎会关闭窗口。添加
call
对我作为管理员运行的Windows 10命令提示符没有影响。我不知道为什么我的批处理文件中的
pause
命令(通过AutoHotKey打开)今天突然停止工作。我不知道发生了什么变化。他们已经工作了几个星期。除了Tim的答案之外,如果您希望窗口始终显示,您可以编写.bat文件,如:call phpunit tests/sometests.php cmd/kt,以cmd(以及之前的MS-DOS)的形式运行批处理文件,结束当前批处理文件的执行。这意味着,在最初的示例中,
phpunit
行之后不会运行任何内容(即,它本身与
pause
无关)。如果您希望在运行外部批处理文件后继续执行当前批处理文件,则需要根据此答案使用
调用
命令。@Marcel您是否因为我将其作为答案而不是注释而对我的答案进行了降级?@Marcel ok我在原始帖子中添加了注释,但也将在此处保留我的答案,注释中的代码格式不清楚。@Justin我正在使用angular CLI
ng

cmd/k
pause>nul
肯定有效,只是没有给出消息
按任何键…
在完美世界中是肯定的,但正如我提到的,它并没有因此而产生这个解决方案。听起来很合理,但并不正确<代码>启动/b在另一个线程中启动新实例。主线程不可能看到该线程的输出。