使用批处理命令编辑和读取.text文件

时间:2014-03-13 13:35:04

标签: batch-file command-line

我正在尝试为自动化测试脚本创建批处理文件。 每次启动主脚本的批处理时,它应该在包含以下内容的同一目录中打开现有的.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:实际上,在考虑了一些之后,我已经得出结论,只要使用我的脚本并保持批处理文件简单,我就可以做得更好。

1 个答案:

答案 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表示操作的结果。