利⽤批处理(BAT)读取字符串空⾏判断及其他最近要给⼀个项⽬发布产品安装包,使⽤到BAT来⾃动配置⼀些环境变量。
由于之前很少⽤BAT,在编写过程中,还是遇到不少坑。
在这⾥,把这些坑给摆出来,以免有些⼩⽩掉进去
系统关键字(感叹号!)冲突
由于是⾃动化部署,因此需要使⽤到循环,这⾥就不可避免的⽤到了延迟变量(setlocal enabledelayedexpansion)
有关延迟变量的知识,⼤家可以通过这篇⽂章涨⼀涨
延迟变量带来的⼀个问题就是,⽂本中的感叹号(!,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
⽤于测试的模板⽂件,命名为p
<configuration>
<!---->
<appSettings>
<add key="FILE_SERVICE_URI" value="$ip$:8080/bingo.dataone/"/>
<add key="DATA_SERVICE_URI" value="$ip$:8080/bingo.dataone/dataservice.dsr"/>    <add key="IS_USE_PERMISSION" value="true"/>
<!--下⾯⼀⾏为⽆空格的空⾏-->
批处理文件注释
</appSettings>
<!--下⾯⼀⾏为有空格的空⾏-->
</configuration>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。