批处理学习笔记(调用函数和原样输出)
作者:互联网
背景
前几天帮助一个同事写了一个批处理,分析一个文件,并做以下处理:
- 固定删除第10行。
- 如果里面有“127.0.0.1”字样,需要全部替换成“192.168.0.89”。
- 其他不涉及的需要原样输出。
- 文本可能包含各种字符,即可能包含批处理的特殊字符,如!、“”、>、|等。
完成上述条件的难度在于,替换字符串时,特殊字符会被丢掉。最后查了很多资料,不负所托,终于完成了任务。在此对本次实现涉及的知识点做一下笔记。
在开始文章之前,首先要感谢大家,因为我查了很多资料,可能到处都会抄一点来用,如果涉及您那一部分,万望不要介意。
本次脚本主要涉及的知识点有两个:
- 批处理内的函数调用。
- 批处理对文章的原样输出。
批处理内的函数调用
批处理的调用函数其实就是跳转标签,但是使用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
总结
在完成这个脚本过程中,我们得到一些结论:
- 应该在适当的地方开启延迟环境变量。
- 任何替换操作都要在开启延迟环境变量之后、关闭延迟环境变量之前处理。
- 如果需要调用函数,需要先把一些特殊字符替换掉,比如>。
- 只有不怕数据破坏(针对特殊字符)的条件下才调用函数,即调用函数判断的,都是不完全依赖原数据的,只需要关键数据即可。比如上例,只需要判断是否是第10行,而不管别的数据是否被破坏,而最后输出到文本的数据,用的是原始数据(var),而不是判断数据(line)。
------------------
如果需要转载文章,请注明出处:https://www.cnblogs.com/yilvqingchen/p/10352534.html
标签:set,批处理,调用函数,echo,原样,exit,var 来源: https://www.cnblogs.com/yilvqingchen/p/10352534.html