![为什么我的 Windows 7 上的 .BAT 文件不能正确暂停?](https://linux22.com/image/1429122/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E7%9A%84%20Windows%207%20%E4%B8%8A%E7%9A%84%20.BAT%20%E6%96%87%E4%BB%B6%E4%B8%8D%E8%83%BD%E6%AD%A3%E7%A1%AE%E6%9A%82%E5%81%9C%EF%BC%9F.png)
我已经在计算机上尝试编写批处理文件一段时间了,我很困惑为什么 PAUSE 不像我想象的那样工作(也许我只是做错了,只是真的很困惑)。
基本上我有:
@echo off
echo Hello!
pause
echo Hi again!
pause
echo HEY HEY!!
pause
当它运行时我得到:
Hello!
Press any key to continue...
然后我只要按一个键就会发生这种情况:
Hi again!
Press any key to continue...
HEY HEY!!
Press any key to continue...
我不明白为什么它会跳过第二次暂停......我注意到如果我这样做:
@echo off
echo Hello!
pause
echo Hi again!
pause
pause
echo HEY HEY!!
pause
然后它会在“Hi again!”处暂停,而不是不暂停地执行它(但是它会连续两次打印“按任意键继续...”)
我真的很迷失,无法继续我的生活,直到我知道为什么会这样:
答案1
可能的简单解释:
如果您按下“特殊”键¹,那么发送到所选窗口中运行的软件²的“stdin”文件中的实际字符将不仅仅是一个字符,而是多个字符。
对于初学者来说,实际发送的字符取决于软件设置,也可能取决于“终端仿真”³
¹)例如 f1,...,f12,光标移动以及可能还有一些类似的功能(home,end,...?)
²)即 cmd.exe 或类似程序
³)例如古老的 ansi.sys 是否已加载
证明、创建、编译一个简单的 C 程序(Bash、gcc、Linux):
$ cat showhex.c #包括 <stdio.h> int main(void){ int c=0; 字符十六进制[] = “0123456789abcdef”; 当(!feof(stdin)){ c=fgetc(标准输入); fputc(十六进制[ (c >> 4) & 0x0f], stdout); fputc(十六进制[ c & 0x0f],stdout); fputc(' ', stdout); } } $ gcc -o showhex showhex.c $ chmod 755./showhex $ ls -hl 显示十六进制 -rwxr-xr-x 1 hannu hannu 8,7K 十二月 5 23:01 显示十六进制 $./showhex ^[[ 1b 5b 41 0a ^[[C 1b 5b 43 0a ^[[B 1b 5b 42 0a ^[[D 1b 5b 44 0a ff $
按下一个键首先会显示实际的字符,然后当您按下 ENTER 时,会打印相应的十六进制代码。
按住 CTRL 并按 D(CTRL+D,bash)或 CTRL+Z,然后按 ENTER(cmd.exe)停止
上面的例子是按
光标向上,输入
光标向右,输入
光标向下,输入
光标向左,输入
CTRL+D
答案2
它按预期工作。该pause
语句只是等待输入。唯一的开关是隐藏它正在等待按键的事实。
当我运行您显示的最后一个批处理文件时,我看到了以下内容:
C:\Users\asdf\Desktop>more test.bat
@echo off
echo Hello!
pause
echo Hi again!
pause
pause
echo HEY HEY!!
pause
C:\Users\asdf\Desktop>test
Hello!
Press any key to continue . . .
Hi again!
Press any key to continue . . .
Press any key to continue . . .
HEY HEY!!
Press any key to continue . . .
所以我发现很难理解你在要求什么......