批处理文件、PING、错误级别和 > null 它们起什么作用?

批处理文件、PING、错误级别和 > null 它们起什么作用?

这似乎是一个非常简单的问题(运行 Windows 7)。但我寻找过答案,却在 Microsoft 的网站上找不到任何内容(韓試&其余一切都是 PING) 或来自大量 Google 搜索。

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

如果我在命令提示符中输入它,它会运行正常,并给出一些结果

PING -n 1 Server04

结果:

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

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

PING -n 1 winsvmnsdev04
PAUSE

结果:

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

我查看了许多问答,其中许多都包含“errorlevel”来回应响应,有些则带有尾随的“> null”。为了理解,我查看了一下,发现这些都没有列为 Microsoft 库中的“PING”属性。

当我跑步时

PING -n 1 winsvmnsdev04 > null
PAUSE

或者运行

PING -n 1 winsvmnsdev04 > null

我得到一行

C:\Users\Me\Desktop>PING -n 1 Server04  1>null

我不知道为什么。有人能解释一下 PING 的这两个属性吗,或者指出官方文档?/n并且-n不要限制一个 PING,当 PING 运行不正常时,>null和不起作用。这些都与 Microsoft 文档的描述不符。PAUSE

笔记: errorlevel未列为命令行参考由 Microsoft

答案1

我怀疑你已经命名了你的批处理文件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!
    
  • 还有另一种语法,来自没有特殊变量的旧 Windows 和 MS-DOS 版本;它检查退出状态是否等于或大于给定一个数字:

    if errorlevel 1 echo The previous command failed!
    

相关内容