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 异常时,>null
和PAUSE
不工作。这些都不符合 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)