bat 中的特殊符号输出问题

Posted ryanzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

 

以上是关于bat 中的特殊符号输出问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言中的特殊符号啥意思代表啥

shell中的命令与特殊符号

BAT特殊字符(转)

java中 去除String中的特殊符号保留字母和数字

未解决的对“片段”部分中的符号“”的引用

Linux Shell编程中的特殊符号