Batch file 批处理文件-变量won';t在指定新值时更新
我有一个简单ping一个框的脚本,如果框应答,它会将一个名为“newstate”的变量更改为up。否则它会被设置为“向下”。出于某种原因,当我在我的机器上运行它时,newstate从未被更改为“up”,即使它是在线的并回复ping 我可能遗漏了一些很小的东西,你能帮忙吗?(我还输入了一个变量来记录状态的变化,但我还没有实现它,因为我甚至无法识别切换)。最终目标是在状态从上到下或从下到上时进行记录 编辑-将%newstate%更改为!新闻状态!,仍然不工作。Batch file 批处理文件-变量won';t在指定新值时更新,batch-file,Batch File,我有一个简单ping一个框的脚本,如果框应答,它会将一个名为“newstate”的变量更改为up。否则它会被设置为“向下”。出于某种原因,当我在我的机器上运行它时,newstate从未被更改为“up”,即使它是在线的并回复ping 我可能遗漏了一些很小的东西,你能帮忙吗?(我还输入了一个变量来记录状态的变化,但我还没有实现它,因为我甚至无法识别切换)。最终目标是在状态从上到下或从下到上时进行记录 编辑-将%newstate%更改为!新闻状态!,仍然不工作。 @setlocal enableext
@setlocal enableextensions enabledelayedexpansion
@echo off
title loop test
set system=192.168.0.155
set oldstate=up
set newstate=down
:loop
echo.
echo ...........
echo pre check
echo old state is %oldstate%
echo new state is !newstate!
echo ...........
echo.
:::::: CONNECTIVITY CHECK ::::::
for /f "tokens=5,7" %%a in ('ping -n 1 -4 !system!') do (
if "x%%a"=="xReceived" if "x%%b"=="x1," set newstate=up
)
echo new state is !newstate!
if !newstate! neq up set newstate=down
set log=%time% - %sytem% - !newstate!
if %oldstate% neq !newstate! set oldstate=!newstate!
echo.
echo ...........
echo post check
echo old state is %oldstate%
echo new state is !newstate!
echo ...........
echo.
:::::: DELAY LOOP ::::::
ping -n 10 127.0.0.1 >nul: 2>nul:
goto :loop
endlocal
使用!新闻状态!获取变量值,而不是%newstate%。这是获取延迟变量值的方法。
继续使用“setlocal enabledelayedexpansion”。很好,它对我很有效,但因为我使用的是西班牙语版本的windows,所以我不得不更改收到的
文本并使用recibidos
。不确定您的本地配置
通常最好检查ping响应中是否存在TTL=
值。如果找到,则目标向上,否则目标向下
ping -n 1 192.168.0.155 | find "TTL=" >nul
if errorlevel 1 (
set "newstate=down"
) else (
set "newstate=up"
)
所以,稍微简化一下
@echo off
setlocal enableextensions disabledelayedexpansion
title loop test
set "system=192.168.1.1"
set "oldState=down"
set "newState=up"
:loop
ping -4 -n 1 %system% | find "TTL=" >nul && set "newState=up" || set "newState=down"
if %newState%==%oldState% (
echo %time% - %system% still %oldState%
) else (
echo %time% - %system% goes %newState%
set "oldState=%newState%"
)
ping -n 10 127.0.0.1 >nul 2>nul
goto loop
其中,ping
行应读为“ping,在输出中查找ttl=,如果找到,将newState设置为up,否则将newState设置为down”
已编辑-
这是测试ping响应的常用方法。在IPv4中。但是在IPv6中ping时,TTL字段没有显示,因此我们无法检查它
在ping命令的输出中测试TTL=
的最初原因是处理数据包计数和错误级别的方式。如果数据包丢失,则设置errorlevel。如果没有数据包丢失,则没有错误级别。但是,ping同一子网中的非活动计算机会生成“无法访问”响应,并且不会丢失数据包,因此,无错误级别和数据包计数反映0数据包丢失。而且
此外,ping输出中的几乎所有信息都是本地化的,因此很难检查ping命令的结果并使其在不同的操作系统本地化中保持一致
但IPv6 ping中的某些情况已经发生了变化。如果无法访问请求的机器,则数据包将丢失并设置errorlevel。是否在同一子网中
并且,如果一些数据包丢失,但至少有一个数据包没有丢失,则不会设置errorlevel
因此,在使用IPv4时,在pingout中测试TTL=
是否存在是检查远程机器状态的“可靠”方法
而且,在使用IPv6时,errorlevel反映了过程的成功与失败
请注意,我不是网络大师。这是我在测试时看到的。如果我错了,请评论。问题就在这句话里
if "x%%a"=="xReceived" if "x%%b"=="x1," set newstate=up
这意味着如果第一个条件和第二个条件设置为
所以-我要插入一个调试行
echo +%%a+%%b+
在此if
语句之前,观察结果。+是一个明显的字符,可以让你更容易看到空间
请记住-if
区分大小写,因此如果需要区分大小写,请使用if/i
另外-如果
在匹配中包含任何空格,则在中观察空格作为带引号的字符串
在本例中,delayedexpansion
没有意义,因为您没有尝试读取(括号内的语句块)中更改的值。在这种情况下,%var%
==!瓦尔代码>您是什么意思,继续使用“setlocal enabledelayexpansion”?我在别的地方禁用了吗?你能回顾一下我所做的改变吗。它仍然不起作用。也许我遗漏了什么?继续使用“setlocal enabledelayexpansion”意味着您应该在脚本中包含它,以便使用延迟变量。你没有残疾。您能解释一下什么不起作用吗?当我使用我的系统名(主机名)时,它不起作用(状态向上/向下不正确)。但当我输入IP地址时,它工作得非常好。我不明白为什么会发生这种情况。“IP工作,主机名不工作”-表明DNS功能有问题。你应该在那个地区登记。是否所有主机都解析为正确的IP。没有冲突/重复等。这非常有效。。。当我使用IP地址时。但是如果我使用我的主机名,那么它就不起作用了。关于如何使它与我的主机名而不是IP一起工作,有什么想法吗?主机名在cmd中可以ping吗(不是在脚本中)?是的,这就是为什么我不明白为什么它不能与主机名一起工作。我想我要做的是ping我的主机名,解析出IP地址,然后在脚本中使用IP地址。