我试图创建一个小批量文件来检查从文本文件中读取的多台PC。对于它找到的任何PC都是可ping的,它会在"结果"中写入一行。文字文件这么说。这就是我所拥有的:
@Echo off
set file=C:\logs\registercheck.txt
date /t >%file%
FOR /F %%I IN (C:\work\regnames.txt) DO (ping /n 1 %%I | ping /n 1 %%I | IF errorlevel 1 goto :nextreg | echo %%I is still on and has not been powered off! >>%file% | :nextreg)
PAUSE
所以...当我运行文件时,我得到多行"此时goto是意外的"并且我输出文本文件中唯一写的是日期。我做错了什么?
谢谢!
答案 0 :(得分:2)
@Echo off
setlocal enableextensions disabledelayedexpansion
set "logFile=C:\logs\registercheck.txt"
set "inputFile=C:\work\regnames.txt"
>>"%logFile%" date /t
for /f "usebackq delims=" %%i in ("%inputFile%") do (
ping -n 1 %%i >nul 2>nul
if not errorlevel 1 (
>>"%logFile%" echo(%%i is still on and has not been powered off!
)
)
您有两个错误。
第一个是将所有命令放在一行中,分隔符不是竖线字符(|
),而是&符号(&
)
第二个是在do
命令的for
代码块内,如果执行了一个goto
,for
命令就完成了,与标签的位置无关被放置。 for
代码块中的标签通常会产生错误(取决于其位置)。
如果不是前面的代码,你想要一个单行循环,它可以写成
for /f "usebackq delims=" %%i in ("%inputFile%") do ( ping -n 1 %%i >nul 2>nul & if not errorlevel 1 >>"%logFile%" echo(%%i is still on and has not been powered off! )
或
for /f "usebackq delims=" %%i in ("%inputFile%") do ( ping -n 1 %%i >nul 2>nul && >>"%logFile%" echo(%%i is still on and has not been powered off! )
使用&&
构造。它旨在作为if not errorlevel 1 ...
的快捷方式。如果&&
左侧的命令没有引发错误级别,则执行右侧的命令。
这是批量sintax。现在ping。 ping命令的行为方式有所不同,具体取决于ip版本。 ping ipv4地址比ping ipv6地址不一样。如果需要,你可以从here抓取一个子线来处理差异。