其他分享
首页 > 其他分享> > 批处理学习笔记(调用函数和原样输出)

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

作者:互联网

背景

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

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

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

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

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

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

 

批处理内的函数调用

批处理的调用函数其实就是跳转标签,但是使用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

总结

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

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

 

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

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

标签:set,批处理,调用函数,echo,原样,exit,var
来源: https://www.cnblogs.com/yilvqingchen/p/10352534.html