批处理文件、PING、errorlevel 和 > null 它们是做什么的?

Jam*_*ins 1 windows-7 batch ping batch-file

这似乎是一个非常简单的问题(运行 Windows 7)。但我一直在寻找答案,但在微软的网站(XP PING一切 PING)或一堆谷歌搜索中找不到任何东西。

我正在学习 DOS/批处理文件。我的开始代码是 PING 一个服务器。

如果我在命令提示符中输入它,它运行良好,并给我一些结果

PING -n 1 Server04
Run Code Online (Sandbox Code Playgroud)

结果:

Pinging Server04.aaaa.xxxx.net [x.x.x.x] with 32 bytes of data:     
Reply from x.x.x.x: bytes=32 time=1ms TTL=125
Run Code Online (Sandbox Code Playgroud)

如果我在批处理文件中运行它,它永远不会停止,但 -n(或 /n)应该只发送一次 PING,并且 PAUSE 也应该停止并保持 cmd.exe 窗口打开。

PING -n 1 winsvmnsdev04
PAUSE
Run Code Online (Sandbox Code Playgroud)

结果:

C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
C:\Users\Me\Desktop>PING -n 1 Server04
Continues until I use Ctrl + C
Run Code Online (Sandbox Code Playgroud)

我查看了一堆问答,其中许多包含“errorlevel”来回应响应,而有些则包含尾随的“> null”。在试图理解时,我已经查看了这些都没有在 Microsoft 库中列为“PING”的属性。

当我跑

PING -n 1 winsvmnsdev04 > null
PAUSE
Run Code Online (Sandbox Code Playgroud)

或者运行

PING -n 1 winsvmnsdev04 > null
Run Code Online (Sandbox Code Playgroud)

我得到一条线

C:\Users\Me\Desktop>PING -n 1 Server04  1>null
Run Code Online (Sandbox Code Playgroud)

我不知道为什么。有人可以解释一下PING的这两个属性,或者指向官方文档吗?/n并且-n不要限制为一个 PING,当 PING 异常时,>nullPAUSE不工作。这些都不符合 Microsoft 文档所描述的内容。

注意: errorlevel没有被微软列为命令行参考

小智 11

我怀疑您已将批处理文件命名为ping.bat,如此处所述,将是您问题的根源。

如果确实是这种情况,那么ping实际发生的事情并不是实际运行ping命令,而是ping.bat使用这些参数 - 将您发送到无限递归中,直到您打破它才结束。

这就是为什么当您运行批处理文件时,您会在命令提示符中看到命令不断迭代而没有任何输出,因为它实际上并不是在执行ping命令,而是使用那些非常参数调用自己,然后调用自己,这 - 好吧,你得到图片。


> null部分是重定向;在>操作装置,该程序的输出将被写入以下文件,而不是控制台。特殊文件名nul(不是null)由 Windows 内部处理;你在那里写的任何东西都会被丢弃。通过这种方式,脚本可以运行程序并检查它是否成功,而不会弄乱控制台。(同样,<将从文件重定向输入。)

1>是完整形式,>意思是“重定向第一个文件描述符”。

  • 在类 Unix 操作系统上,文件描述符是程序用来引用程序当前打开的文件的数字。按照惯例,文件描述符 0、1、2 对应于“标准输入”(stdin)、“标准输出”(stdout)和“标准错误输出”(stderr);所有较高的数字对应于程序本身已打开的文件。

  • Windows 在许多方面与此不同——它使用“文件句柄”并且不将它们编号为 0-1-2-3……只是一些小的差异。然而,cmd.exe脚本解释器仍然理解1>并特别2>意味着重定向常规输出和错误输出,使来自 Linux 或其他类 Unix 系统的人的事情变得更容易一些。


至于errorlevel,它不是命令,而是命令中的一种模式if。每个程序在退出时都会向系统(和父程序)返回一个称为“退出状态”的数字;按照惯例,0 表示成功,而 ?1 表示某种失败。

  • 在 中cmd.exe,您可以通过特殊%errorlevel%变量访问最后一个命令的退出状态,例如:

    if %errorlevel% NEQ 0 echo The previous command failed!
    
    Run Code Online (Sandbox Code Playgroud)
  • 还有另一种语法,来自没有特殊变量的旧 Windows 和 MS-DOS 版本;它检查退出状态是否等于或大于给定数字:

    if errorlevel 1 echo The previous command failed!
    
    Run Code Online (Sandbox Code Playgroud)