gpt4 book ai didi

windows - 循环的批处理脚本不起作用

转载 作者:可可西里 更新时间:2023-11-01 11:35:06 27 4
gpt4 key购买 nike

我需要让多个远程管理员在现场测试他们的下载速度。 Speedtest.net 等并不是我们 WAN 性能的真实指标。我不想使用 iperf,因为我需要尽量减少远程管理员的技术知识和工作量。我也不希望他们必须安装任何东西。因此我需要一个简单的批处理文件来下载测试文件 5 次。这是我目前所拥有的:

@echo off
rem localize variables to this script
setlocal
rem delete the test file if it already exists
if exist %HomePath%\Downloads\100meg.test del %HomePath%\Downloads\100meg.test
rem perform the test 5 times
for /l %%i IN (1,1,5) DO (
rem mark the start time
set STARTTIME=%TIME%
echo Download started at:%STARTTIME%
rem start download
C:\windows\explorer.exe http://mirror.internode.on.net/pub/test/100meg.test
rem check for file download completion
:while
if exist %HomePath%\Downloads\100meg.test goto wend
goto while
:wend
rem mark the end time
set ENDTIME=%TIME%
echo Download completed at:%ENDTIME%
rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)
rem calculate the time taken in seconds
set /A DURATION=(%ENDTIME%-%STARTTIME%)/100
echo Download took:%DURATION% seconds
rem delete the test file ready for next iteration
del %HomePath%\Downloads\100meg.test
)

问题是,由于添加了 for 并将 block 括在它的方括号中,它停止工作了。任何人都可以阐明为什么会失败吗?

谢谢!

最佳答案

在 FOR 循环中使用 GOTO 总是会中断循环 - 一旦您使用 GOTO,剩余的迭代将不会发生。

这是因为 CMD.EXE 的工作方式。括号内的整个命令 block 被一次性解析并加载到内存中。每次迭代都执行存储在内存中的已解析命令。这些解析的命令不包含任何标签。 GOTO 必须扫描文件,这需要打破循环。

STARTTIME 的“消失”值还与一次解析整个 block 这一事实有关。 %STARTTIME% 在解析时被扩展,但是命令在任何 block 被执行之前被解析。因此,您将获得执行 FOR 命令之前存在的值,该值可能未定义。有一个称为延迟扩展的功能,可用于在执行时而不是解析时获取变量的值。在命令提示符下键入 HELP SET 并阅读文档中大约一半开始的有关延迟扩展的部分。

但是有一种简单的方法可以让您的代码工作 - 只需将 DO block 的内容移动到一个子例程,然后在您的循环中调用该例程。 (我假设您在 DO 子句中的逻辑在其他方面是正确的)。 CALL 不会中断循环:-)

您必须记住在您的例程标签之前放置一个 EXIT/B,这样您的主代码就不会落到子例程中。

@echo off
rem localize variables to this script
setlocal
rem delete the test file if it already exists
if exist %HomePath%\Downloads\100meg.test del %HomePath%\Downloads\100meg.test
rem perform the test 5 times
for /l %%i IN (1,1,5) do call :downloadTest
exit /b

:downloadTest
rem mark the start time
set STARTTIME=%TIME%
echo Download started at:%STARTTIME%
rem start download
C:\windows\explorer.exe http://mirror.internode.on.net/pub/test/100meg.test
rem check for file download completion
:while
if exist %HomePath%\Downloads\100meg.test goto wend
goto while
:wend
rem mark the end time
set ENDTIME=%TIME%
echo Download completed at:%ENDTIME%
rem convert STARTTIME and ENDTIME to centiseconds
set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)
rem calculate the time taken in seconds
set /A DURATION=(%ENDTIME%-%STARTTIME%)/100
echo Download took:%DURATION% seconds
rem delete the test file ready for next iteration
del %HomePath%\Downloads\100meg.test
exit /b

关于windows - 循环的批处理脚本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com