批处理学习笔记(调用函数和原样输出)

背景

前几天帮助一个同事了一个批处理,分析一个文件,做以下处理:

  1. 固定删除10行
  2. 如果里面有“127.0.0.1”字样,需要全部替换成“192.168.0.89”
  3. 其他不涉及的需要原样输出。
  4. 文本可能包含各种字符,即可能包含批处理的特殊字符“”、>|等

完成上述条件的难度在于替换字符串时,特殊字符会被丢掉。最后查了很多资料,不负所托终于完成了任务。在此对本次实现涉及的知识点一下笔记

在开始文章之前,首先要感谢大家,因为我查了很多资料,可能到处都会抄一点来用,如果涉及您那一部分,万望不要介意。

本次脚本主要涉及的知识点有两个:

  1. 批处理内的函数调用。
  2. 批处理对文章的原样输出。

批处理内的函数调用

批处理的调用函数其实就是跳转标签,但是使用call来调用(不是用goto)然后使用exit /b XX代表数字,比如1、2、3100等)返回,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

总结

完成这个脚本过程中,我们得到一些结论:

  1. 应该在适当的地方开启延迟环境变量
  2. 任何替换操作要在开启延迟环境变量之后、关闭延迟环境变量之前处理。
  3. 如果需要调用函数,需要先把一些特殊字符替换掉,比如>。
  4. 只有不怕数据破坏(针对特殊字符的条件下调用函数即调用函数判断的,都是不完全依赖原数据的只需要关键数据即可。比如例,只需要判断是否是第10行,而不管别的数据是否被破坏,而最后输出文本的数据用的是原始数据(var)而不是判断数据(line

------------------

如果需要转载文章,请注明出处:https://www.cnblogs.com/yilvqingchen/p/10352534.html

猜你喜欢

转载自www.cnblogs.com/yilvqingchen/p/10352534.html
今日推荐