我正在尝试为自动化测试脚本创建批处理文件。 每次启动主脚本的批处理时,它应该在包含以下内容的同一目录中打开现有的.txt文件:
10.200.6.111 inactive
10.200.6.112 inactive
10.200.6.113 inactive
10.200.6.114 inactive
etc...
然后它应该导航到具有它自己的IP(在批处理中指定)的行并替换'不活动的'标记为'有效' (表明该系统现已开始测试)。理想情况下,它还会附加一个时间戳,也许还有这些内容:
for /f "tokens=1-5 delims=:" %%d in ("%time%") //and then add %%d-%%e at the end?
我之前尝试过做类似的事情并且还查看了现有的主题,但是一切似乎都非常具体,我缺乏自己适应它们的技能。最终我需要一个不同的.bat来读取这个文件,并推迟任何行动,直到所有活动'标签消失了。但是到目前为止只有一个vm正在进行测试,如果我能让它发挥作用,那真的是我的肩膀。在此先感谢您的任何帮助,如果这是重复的话,我道歉,我确实尝试找到我可以使用的东西!
PS:我真的很害怕'得到'通用代码有时候,它之前已经得到了明确的回答,而且我无法理解解决方案。
编辑:为了澄清,它应该大致如下:
10.200.6.111 inactive
10.200.6.112 inactive
10.200.6.113 active 14:20
10.200.6.114 inactive
etc...
编辑2:实际上,在考虑了一些之后,我已经得出结论,只要使用我的脚本并保持批处理文件简单,我就可以做得更好。
答案 0 :(得分:0)
@echo off
setlocal enableextensions disabledelayedexpansion
:: define the log file
set "file=%~nx0.test.txt"
:: generate some lines in log file to test
if not exist "%file%" (
echo 10.200.6.111 inactive
echo 10.200.6.112 inactive
echo 10.200.6.113 inactive
echo 10.200.6.114 inactive
) > "%file%"
:: define the ip of the current node
set "ip=10.200.6.114"
:: change status in log file to active and shows sucess/failure of operation
call :changeStatus "%file%" "%ip%" "active %time:~0,5%"
if errorlevel 1 (
echo failed to change status
) else (
echo status changed
)
:: dump file to see changes
call :dumpFile "%file%"
:: change status in log file to inactive
call :changeStatus "%file%" "%ip%" "inactive"
:: dump file to see changes
call :dumpFile "%file%"
exit /B
:dumpFile file
echo(
echo(----------------------------------
type "%~1"
echo(----------------------------------
echo(
exit /b
:changeStatus file ip status
setlocal enableextensions
set "file=%~1"
set "ip=%~2"
set "status=%~3"
set "retries=0123456789"
set "exitCode=0"
:changeStatusRetry
(>"%file%.lock" (
set "reset=1"
for /f "usebackq tokens=1*" %%a in ("%file%") do (
if defined reset ( set "reset=" & >"%file%" break )
(if "%%a"=="%ip%" (
echo(%%a %status%
) else (
echo(%%a %%b
)) >> "%file%"
)
) && set "exitCode=0" || set "exitCode=1") >nul 2>nul
if "%exitCode%"=="1" (
ping -n 2 localhost >nul 2>nul
set "retries=%retries:~0,-1%"
if defined retries ( set "exitCode=0" & goto changeStatusRetry )
)
del /q "%file%.lock" >nul 2>nul
endlocal & exit /b %exitCode%
这使用子例程来处理对日志文件的更改。它还处理来自多个进程的文件锁定。更改数据时锁定日志文件访问权限,如果在更改文件时它被锁定,则重试最多10次以写入更改的数据。从子程序返回时,errorlevel表示操作的结果。