• bat 中的特殊符号输出问题


    系统关键字(感叹号!)冲突

    由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(setlocal enabledelayedexpansion)
    有关延迟变量的知识,大家可以通过这篇文章涨一涨http://www.jb51.net/article/29323.htm
     
    延迟变量带来的一个问题就是,文本中的感叹号(!,xml文件中的注释)被替换掉了。
    解决办法就是,在给文件中字符串进行赋值前,使用endlocal禁用掉延迟变量。
     

    bat读取文本时,空行的判断

    空行有两种类型,一种是不包括空格的换行,一种是包括空格的换行。
    如果不判断空行,在使用echo时,会输出 echo处于关闭状态。这时如果需要对读取到的字符串进行替换操作,也会报错。
            尝试过echo.,但最后发现还是会延伸出来一些问题。因此需要对这两种情况进行判断。
    1. 不包括空行的判断,在使用for循环读取的时候,可以使用 if defined var判断
    2. 包括空格的判断,使用set var=!var: =!把空格替换掉,然后使用 if "!var!"==""进行判断
    以下为程序源码
     
    bat运行程序
    @echo  off
    rem 循环查找.temp格式的模板文件并复制新文件
    for /r %%a in (*.temp) do (
        set f=%%a
        setlocal enabledelayedexpansion 
        set nf=!f:.temp=!
        rem 替换前,删除旧文件
        if exist !nf! (
            del !nf!
        )
        endlocal
        rem 开始逐行替换旧文件
        for /f "eol== delims=" %%i in ('findstr   /i /n .* %%a') do (            
            set "var=%%i"    
            rem 后面要用到变量,因此此处启用延迟变量
            setlocal enabledelayedexpansion         
            set var=!var:*:=!
            rem 获取需要生成的目标文件名     
            set nf=!f:.temp=!
            set tmp=!var: =!
            rem 排除无空格空行
            if defined var (
                rem 排除包含空格的空行
                if /i not "!tmp!"=="" (            
                    (echo !var!)>>!nf!
                ) else (
                    echo.!var!>>!nf!
                )
                ) else (
                    echo.>>!nf!
            )
            rem 此处禁用延迟变量,以使下一次循环时,能够正常读取字符
            endlocal
         )
        setlocal enabledelayedexpansion
        set nf=!f:.temp=!
        echo 配置文件!nf!设置成功
        start !nf!
        pause
        endlocal
    )
    pause
    exit
     

    用于测试的模板文件,命名为test.txt.temp

    <configuration>
    <!---->
      <appSettings>  
        <add key="FILE_SERVICE_URI" value="http://$ip$:8080/bingo.dataone/"/> 
        <add key="DATA_SERVICE_URI" value="http://$ip$:8080/bingo.dataone/dataservice.dsr"/>
        <add key="IS_USE_PERMISSION" value="true"/> 
    <!--下面一行为无空格的空行-->
     
      </appSettings>
    <!--下面一行为有空格的空行-->  
      
    </configuration>
  • 相关阅读:
    程序员的九重境界,你是第几重?
    一个常用的正则表达验证类(转载)
    学习程序设计的态度
    科技期刊学术不端文献检测系统(转载)
    用GridView设计固定行数的入库单报表
    JavaScript技巧集
    线程的概念
    java实验三 类的继承与多态
    常见的网络攻击手段及防御方法
    类和对象的概念(转载)
  • 原文地址:https://www.cnblogs.com/ryanzheng/p/9462624.html
Copyright © 2020-2023  润新知