bat 中的特殊符号输出问题
2024-09-04 17:30:15
系统关键字(感叹号!)冲突
由于是自动化部署,因此需要使用到循环,这里就不可避免的用到了延迟变量(setlocal enabledelayedexpansion)
有关延迟变量的知识,大家可以通过这篇文章涨一涨http://www.jb51.net/article/29323.htm
延迟变量带来的一个问题就是,文本中的感叹号(!,xml文件中的注释)被替换掉了。
解决办法就是,在给文件中字符串进行赋值前,使用endlocal禁用掉延迟变量。
bat读取文本时,空行的判断
空行有两种类型,一种是不包括空格的换行,一种是包括空格的换行。
如果不判断空行,在使用echo时,会输出 echo处于关闭状态。这时如果需要对读取到的字符串进行替换操作,也会报错。
尝试过echo.,但最后发现还是会延伸出来一些问题。因此需要对这两种情况进行判断。
- 不包括空行的判断,在使用for循环读取的时候,可以使用 if defined var判断
- 包括空格的判断,使用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>
最新文章
- CENTOS 6.5 平台离线编译安装 Mysql5.6.22
- Linux下如何自己编译源代码(制作成可以安装的.deb文件)
- md语法之行内代码和代码片续集
- Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题
- PHP mkdir()无写权限的问题解决方法
- error while loading shared libraries: libXXX.so.x: cannot open shared object file: No such file or directory .
- mysqlbinglog基于即时点还原
- EF 用CallContext上下文管理
- js的with语句使用方法
- 使用Android Studio与ArcGIS Android SDK的开发环境部署和HelloWorld
- Linux Kernel 4.8分支第4个候选版本发布
- QML官方系列教程——QML Applications
- POJ 3311 Hie with the Pie (BFS+最短路+状态压缩)
- PHP实反向代理-收藏
- ajax 提交表单(文件)
- Alpha冲刺Day4
- pyc
- mysql5.7忽略大小写问题
- 通过google cloud API 使用 WaveNet
- Android 9.0更新