批处理之坑爹的感叹号和变量延迟扩展(转)

更新时间:2023-05-31 02:52:15 阅读: 评论:0

批处理之坑爹的感叹号和变量延迟扩展(转)
先来说说变量延迟扩展吧。当然,放狗⼀搜,就能看到满天飞的关于变量延迟扩展的⽂章,所以,我这⾥就简单介绍⼀下。先来看⼀段批处理:
盼望长大t str=test
if %str%==test (
t str=another test
echo %str%
)
上⾯的代码段极其简单,给str赋值,判断其值是否为test,如果是,重新赋值为another test,再显⽰str的值。
作为正常⼈的思维,这⾥显⽰的肯定是another test了,但其实不是,其显⽰的仍然是test,这是为什么?因为:windows在解释执⾏此代码段时,在遇到if语句后的括号后,只把它当⼀条语句处理⽽不是两
条语句,所以,在第⼆条语句中的%str%会被替换成它⽬前的值test,上⾯的代码相当于下⾯的代码的效果:
懒娃娃t str=test
if %str%==test (
t str=another test
echo test    ::注意这⾥
珍惜时间)
所以,输出⾃然是test了。
这样编程的灵活性就⼤⼤降低了,于是,M$就想了⼀个workground的⽅法,那就是变量延迟,很简单,看如下代码:
@echo off
tlocal enabledelayedexpansion    ::注意这⾥
t str=test
if %str%==test (
t str=another test
echo !str!      ::注意这⾥
echo %str%  ::区别
)
现在会输出什么呢?试⼀下就知道,第⼀⾏输出another test,第⼆⾏输出test。
现在解释⼀下,tlocal enabledelayedexpansion⽤于开启变量延迟,这是告诉解释器,在遇到复合语句的时候,不要将其作为⼀条语句同时处理,⽽仍然⼀条⼀条地去解释。但是这时必须⽤!str!来引⽤变量,如果仍然⽤%str%引⽤是不起作⽤的。
好了,变量延迟扩展解释完了,⾄少这就是我知道的变量延迟扩展。
=========================== 我是⾃豪的分割线,如果你只想知道变量延迟扩展是怎么回事,
看到这⾥就OK了
===========================
今天变量延迟扩展和感叹号让我蛋疼了半天,所以现在也要来扯扯它们的蛋。
试试以下代码段:
@echo off
tlocal enabledelayedexpansion
t str=test残忍的缠绵
echo %str%
开启变量延迟,给str赋值,输出str,于是,输出⾃然是test了。但其实,windows告诉我们,⼜错了,输出是test,感叹号被windows吃了。
当然如果注释掉开启变量延迟那⼀⾏,这⼏⾏是可以正常⼯作的,所以说是开启变量延迟影响了我们正常的⼯作,但我⾄今还没搞清楚为什么会这样,这只有M$知道。估计把!作为了变量延迟的标⽰符。
于是,关闭变量延迟吧,可是程序⼜需要使⽤变量延迟来实现⼀些逻辑,怎么办?两个办法:
梦见老领导1.暂时关闭变量延迟:
@echo off可乐姜汤的做法
tlocal enabledelayedexpansion
:: do something here
tlocal disabledelayedexpansion    ::关闭变量延迟
t str=test
体育课的英语echo %str%
tlocal enabledelayedexpansion
::
在需要处理感叹号的地⽅,暂时关闭变量延迟,处理完后再打开。这时能正常输出感叹号。
2.在开启变量延迟之前t:
@echo off
t str=test
tlocal enabledelayedexpansion
echo !str!    ::注意这⾥
在开启变量延迟之前设置好变量,但是要注意,在使⽤变量的时候,需要使⽤感叹号引⽤。这时感叹号也可以正常输出。
最后贴⼀段为什么让我蛋疼的代码(变量延迟⾃然是打开的):
t rver=%~1
飞快的反义词
t urname=%~2
t password=%~3
echo %date%, %time% [INFO]  Report rver address: [%rver%], urname: [%urname%], password: [*******]
< -i "PublishReports.rss" -s "%rver%" -u "%urname%" -p "%password%" -l 600
为了不回显password,我输出了⼀⼤串*。在我机器上测试时,我的password字符都很常规,所以通过。但是,QA的password⾥⾯有感叹号。。。
关键的是,这⾥调⽤的是M$的Report Server的rs.exe来上传模板,它抛出⼀个Could not connect的exception,于是,我⾃然地想到是report rver的rvice出了问题,但查了好久也没发现report rver有什么问题。。。谁TMD会想到是别⼈的password⾥有感叹号,谁TMD⼜会想到是跟所谓延迟变量的冲突导致的,更有谁会想到,我⾃⼰⾃作聪明地为了不显⽰password⽽显⽰出了⼀⼤串hard code的星号导致看不到password的值。。。
这么多巧合在⼀起,谁能不蛋疼。。。

本文发布于:2023-05-31 02:52:15,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/817488.html

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

标签:变量   延迟   扩展   开启   感叹号   语句   灵活性   遇到
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图