Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理文件-变量won';t在指定新值时更新_Batch File - Fatal编程技术网

Batch file 批处理文件-变量won';t在指定新值时更新

Batch file 批处理文件-变量won';t在指定新值时更新,batch-file,Batch File,我有一个简单ping一个框的脚本,如果框应答,它会将一个名为“newstate”的变量更改为up。否则它会被设置为“向下”。出于某种原因,当我在我的机器上运行它时,newstate从未被更改为“up”,即使它是在线的并回复ping 我可能遗漏了一些很小的东西,你能帮忙吗?(我还输入了一个变量来记录状态的变化,但我还没有实现它,因为我甚至无法识别切换)。最终目标是在状态从上到下或从下到上时进行记录 编辑-将%newstate%更改为!新闻状态!,仍然不工作。 @setlocal enableext

我有一个简单ping一个框的脚本,如果框应答,它会将一个名为“newstate”的变量更改为up。否则它会被设置为“向下”。出于某种原因,当我在我的机器上运行它时,newstate从未被更改为“up”,即使它是在线的并回复ping

我可能遗漏了一些很小的东西,你能帮忙吗?(我还输入了一个变量来记录状态的变化,但我还没有实现它,因为我甚至无法识别切换)。最终目标是在状态从上到下或从下到上时进行记录

编辑-将%newstate%更改为!新闻状态!,仍然不工作。

@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地址。