前几天帮助一个同事写了一个批处理,分析一个文件,并做以下处理:
完成上述条件的难度在于,替换字符串时,特殊字符会被丢掉。最后查了很多资料,不负所托,终于完成了任务。在此对本次实现涉及的知识点做一下笔记。
在开始文章之前,首先要感谢大家,因为我查了很多资料,可能到处都会抄一点来用,如果涉及您那一部分,万望不要介意。
本次脚本主要涉及的知识点有两个:
批处理的调用函数其实就是跳转标签,但是使用call来调用(而不是用goto),然后使用exit /b X(X代表数字,比如1、2、3、100等)返回,而X就是调用函数的返回值,使用errorlevel获取。如下例子:
@echo off set “checkstr= check is have hello” call :checkreturn %checkstr% if %errorlevel%. equ 100. (echo yes, have hello! & goto :end) echo no, we don’t have hello! goto :end :checkreturn If %1. equ . (exit /b 0) if %1. equ hello. (exit /b 100) shift goto :checkreturn exit /b 0 :end pause exit
本例是通过“调用函数”checkreturn来检测语句中是否存在“hello”这个单词,如果存在,则返回100,并打印“yes, have hello!”,否则便返回0,并打印“no, we don’t have hello!”。
如果要原样输出文章(包括特殊字符)的目的,则需要注意在必要的地方开启和关闭环境延迟变量。如下例子:
cd.>output.txt for /f "delims=" %%i in (‘findstr /n .* 123.txt‘) do ( set "var=%%i" setlocal enabledelayedexpansion set var=!var:*:=! (echo.!var!)>>output.txt endlocal )
本例只是原样输出文章,不做任何修改和判断,能支持文章内存在各种特殊字符。
上面两个例子都是非常简单的,但这两个知识点是本次实现的核心。结合上面两个例子,我们可以达到了解决问题的目的,具体脚本如下:
@echo off set filepath="D:\123.txt" set skipline=10 set oldreplacestr=127.0.0.1 set newreplacestr=192.168.0.89 cd.>output.txt echo start translation... echo ---------------------------------------------------- echo. for /f "delims=" %%i in (‘findstr /n .* %filepath%‘) do ( set "var=%%i" setlocal enabledelayedexpansion set line=!var:^>=! set line=!line::= ! call :checkline !line! if !errorlevel!. neq 1. ( set var=!var:%oldreplacestr%=%newreplacestr%! set var=!var:*:=! echo.!var! (echo.!var!)>>output.txt) endlocal ) echo. echo ---------------------------------------------------- echo translate complete. echo. goto :end :checkline if %1. equ . (exit /b 0) if %1. equ %skipline%. (exit /b 1) exit /b 0 :end pause exit
在完成这个脚本过程中,我们得到一些结论:
------------------
如果需要转载文章,请注明出处:https://www.cnblogs.com/yilvqingchen/p/10352534.html
原文:https://www.cnblogs.com/yilvqingchen/p/10352534.html