批处理脚本循环变量

4

我觉得我可能缺少了一些简单的东西,而且由于嵌套循环的原因,我有一种感觉它不起作用。这是一个我从某个地方找来并稍微修改了一下以进行更多测试的简单脚本。基本上,它只会延迟一段时间后不断地对主机进行ping测试,直到您关闭它,但会记录失败的响应。所有功能都正常,但是我无法弄清楚如何更新for循环中使用的名称。

@echo off
setlocal enabledelayedexpansion

:: ** Enter name to identify host in log **
set name1=Test 1
set name2=Test 2
set name3=Test 3

:: ** Enter IP or HOSTNAME to test against **
set hostIP1=1.1.1.1
set hostIP2=2.2.2.2
set hostIP3=3.3.3.3

:: ** Enter Delay in milliseconds between each test **
set delayMS=2000


title -DO NOT CLOSE- Ping Test
echo DO NOT CLOSE
echo Ping Test


:loop
set namecount=1
for %%x in (%hostIP1% %hostIP2% %hostIP3%) do (
set pingline=1
set pingname=name!namecount!
for /f "delims=" %%A in ('ping -n 1 -w 2000 -l 255 %%x') do (
    if !pingline! equ 2 (
        set logline=!date! !time! "%%A" - %%x !%pingname%!
        echo !logline! | find "TTL=">nul || echo !logline! >> pinglog.txt
        )
    set /a pingline+=1
    )
set /a namecount+=1
)
sleep -m %delayMS%
goto loop

通常我会使用另一种语言,但我需要在各种Windows服务器上运行。这似乎是最可靠的方法。谢谢。

1个回答

0

这是不正确的:

!%pingname%!

试试这个:

!Pingname!

我无法尝试您的代码,但我已经进行了其他小的更正:

(更新)

 @echo off
setlocal enabledelayedexpansion

:: ** Enter name to identify host in log **
set "name1=Test 1"
set "name2=Test 2"
set "name3=Test 3"

:: ** Enter IP or HOSTNAME to test against **
set "hostIP1=1.1.1.1"
set "hostIP2=2.2.2.2"
set "hostIP3=3.3.3.3"

:: ** Enter Delay in milliseconds between each test **
set /A "delayMS=2000"


title -DO NOT CLOSE- Ping Test
Echo DO NOT CLOSE
Echo Ping Test

:loop
set /A "namecount=1"
for %%x in (%hostIP1% %hostIP2% %hostIP3%) do (
    set /A "pingline=1"
    call set "pingname=%%name!namecount!%%"
    for /f "delims=" %%A in ('ping -n 1 -w 2000 -l 255 %%x') do (
        if !pingline! equ 2 (
            set "logline=%date% !time! %%A - %%x !pingname!"
            (echo !logline! | find "TTL=">nul) || (echo !logline! >> "pinglog.txt")
        )
        set /a "pingline+=1"
    )
    set /a "namecount+=1"
)
sleep -m %delayMS%
goto :loop

感谢整理。不幸的是,!pingname! 不起作用,因为它只会显示我需要展开的变量名称。所以我在日志中看到了 name1 name2 name3。使用 !%pingname%! 我可以展开变量,但它没有正确递增。 - mbazdell
这是因为您没有展开变量,您始终获取的是变量“%var%”,添加!!和%%不起任何作用。我在代码中又纠正了一件事,我更新了我的答案,您将变量设置错误在行:set "pingname=name!namecount!" - ElektroStudios
尝试过了,但仍然只使用name1。 - mbazdell
我已经编辑了我的答案,请再次尝试新代码。这一次我尝试了一下,它更新了名称,但我不知道是否按照你想要的“X”次更新,每轮更新1次。(对我的英语表示抱歉) - ElektroStudios
太棒了。我现在明白了 %%name!namecount!%% 部分的作用。它现在完全按预期工作了。非常感谢! - mbazdell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接