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

由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(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 中的特殊符号输出问题的更多相关文章

  1. Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  2. 【转】【bat】Bat 中特殊符号

    批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set ...

  3. [转]bat中的特殊字符,以及需要在bat中当做字符如何处理

    bat中的特殊字符,以及需要在bat中当做字符如何处理 批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @ \\隐藏命令的回显. ~ \\在for中表示使用增强的变量扩 ...

  4. bat中的特殊字符,以及需要在bat中当做字符如何处理

    bat中的特殊字符,以及需要在bat中当做字符如何处理 (2014-02-27 21:16:55) 转载▼ 标签: bat 特殊字符 分类: develop bat中的特殊字符,以及需要在bat中当做 ...

  5. 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  6. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  7. 深入理解计算机系统(2.5)------C语言中的有符号数和无符号数以及扩展和截断数字

    上一篇博客我们讲解了计算机中整数的表示,包括无符号编码和补码编码,以及它们之间的互相转换,个人觉得那是非常重要的知识要点.这篇博客我们将介绍C语言中的有符号数和无符号数以及扩展和截断数字. 1.C语言 ...

  8. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  9. linux中如何通过echo输出!(叹号)? -bash: !": event not found

    需求描述: 今天在做通过echo结合passwd给用户改密码的过程中,出现无法修改的错误. 错误如下: [root@testvm ~]# useradd mytest [root@testvm ~]# ...

随机推荐

  1. Linux下端口被占用如何解决???

    有时候关闭软件后,后台进程死掉,导致端口被占用.下面以JBoss端口8083被占用为例,列出详细解决过程. 解决方法: 1.查找被占用的端口 netstat -tln netstat -tln | g ...

  2. mysql 忘记root密码的解决办法

    1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...

  3. SQL Server数据库log shipping 灾备(Part1 )

    1.概述 Log Shipping为SQL Server提供的数据库备份过程.它可以将数据库整个复制到另一台服务器上.在这种情况下,交易日志也会定期发送到备份服务器上供恢复数据使用,这使得服务器一直处 ...

  4. BZOJ 4491: 我也不知道题目名字是什么 RMQ

    4491: 我也不知道题目名字是什么 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 317  Solved: 174[Submit][Status][ ...

  5. 读书笔记2013-2 Linux内核设计与实现A

    读书笔记2013-2 Linux内核设计与实现A <Linux内核设计与实现> 简介 这本书不是想Linux源码剖析那样一行行分析Linux源代码的书,而是从Linux历史,Linux哲学 ...

  6. cluvfy stage命令用法

    1.获取集群验证工具cluvfy的帮助信息 grid@rac1:/home/grid>cluvfy -help USAGE: cluvfy [ -help ] cluvfy stage { -l ...

  7. 解除phpMyAdmin导入大型MySQL数据库文件大小限制

    phpMyAdmin 导入大型数据库文件大小限制配置… 1. 修改 php.ini 文件中下列3项的值: upload_max_filesize, memory_limit 和 post_max_si ...

  8. 使用Timer组件制作左右飘动的窗体

    实现效果: 知识运用: Form类的Left和Top属性 实现代码: private void timer1_Tick(object sender, EventArgs e) { Rectangle ...

  9. jQuery如何获取选中单选按钮radio的值

    使用jquery获取radio的值,最重要的是掌握jquery选择器的使用,在一个表单中我们通常是要获取被选中的那个radio项的值,所以要加checked来筛选,比如有以下的一些radio项: 1. ...

  10. overloading and overriding

    What is the difference between method overloading and method overriding in Java? Differences between ...