先来说说变量延迟扩展吧。当然,放狗一搜,就能看到满天飞的关于变量延迟扩展的文章,所以,我这里就简单介绍一下。先来看一段批处理:

set str=test
if %str%==test (
set str=another test
echo %str%
)

上面的代码段极其简单,给str赋值,判断其值是否为test,如果是,重新赋值为another test,再显示str的值。

作为正常人的思维,这里显示的肯定是another test了,但其实不是,其显示的仍然是test,这是为什么?因为:windows在解释执行此代码段时,在遇到if语句后的括号后,只把它当一条语句处理而不是两条语句,所以,在第二条语句中的%str%会被替换成它目前的值test,上面的代码相当于下面的代码的效果:

set str=test
if %str%==test (
set str=another test
echo test    ::注意这里
)

所以,输出自然是test了。

这样编程的灵活性就大大降低了,于是,M$就想了一个workground的方法,那就是变量延迟,很简单,看如下代码:

@echo off
setlocal enabledelayedexpansion    ::注意这里
set str=test
if %str%==test (
set str=another test
echo !str!      ::注意这里
echo %str%  ::区别
)

现在会输出什么呢?试一下就知道,第一行输出another test,第二行输出test。

现在解释一下,setlocal enabledelayedexpansion用于开启变量延迟,这是告诉解释器,在遇到复合语句的时候,不要将其作为一条语句同时处理,而仍然一条一条地去解释。但是这时必须用!str!来引用变量,如果仍然用%str%引用是不起作用的。

好了,变量延迟扩展解释完了,至少这就是我知道的变量延迟扩展。

=========================== 我是自豪的分割线,如果你只想知道变量延迟扩展是怎么回事,看到这里就OK了 ===========================

今天变量延迟扩展和感叹号让我蛋疼了半天,所以现在也要来扯扯它们的蛋。

试试以下代码段:

@echo off
setlocal enabledelayedexpansion
set str=test!!!
echo %str%

开启变量延迟,给str赋值,输出str,于是,输出自然是test!!!了。但其实,windows告诉我们,又错了,输出是test,感叹号被windows吃了。

当然如果注释掉开启变量延迟那一行,这几行是可以正常工作的,所以说是开启变量延迟影响了我们正常的工作,但我至今还没搞清楚为什么会这样,这只有M$知道。

于是,关闭变量延迟吧,可是程序又需要使用变量延迟来实现一些逻辑,怎么办?两个办法:

1.暂时关闭变量延迟:

@echo off
setlocal enabledelayedexpansion
:: do something here
setlocal disabledelayedexpansion    ::关闭变量延迟
set str=test!!!
echo %str%
setlocal enabledelayedexpansion
:: continue...

在需要处理感叹号的地方,暂时关闭变量延迟,处理完后再打开。这时能正常输出感叹号。

2.在开启变量延迟之前set:

@echo off
set str=test!!!
setlocal enabledelayedexpansion
echo !str!    ::注意这里

在开启变量延迟之前设置好变量,但是要注意,在使用变量的时候,需要使用感叹号引用。这时感叹号也可以正常输出。


最后贴一段为什么让我蛋疼的代码(变量延迟自然是打开的):

set server=%~1
set username=%~2
set password=%~3
echo %date%, %time% [INFO]   Report server address: [%server%], username: [%username%], password: [*******]
rs.exe -i "PublishReports.rss" -s "%server%" -u "%username%" -p "%password%" -l 600

为了不回显password,我输出了一大串*。在我机器上测试时,我的password字符都很常规,所以通过。但是,QA的password里面有感叹号。。。

关键的是,这里调用的是M$的Report Server的rs.exe来上传模板,它抛出一个Could not connect的exception,于是,我自然地想到是report server的service出了问题,但查了好久也没发现report server有什么问题。。。谁TMD会想到是别人的password里有感叹号,谁TMD又会想到是跟所谓延迟变量的冲突导致的,更有谁会想到,我自己自作聪明地为了不显示password而显示出了一大串hard code的星号导致看不到password的值。。。

批处理——感叹号和变量延迟扩展相关推荐

  1. windows批处理的感叹号和变量延迟扩展

    先来说说变量延迟扩展吧.当然,放狗一搜,就能看到满天飞的关于变量延迟扩展的文章,所以,我这里就简单介绍一下.先来看一段批处理: set str=test if %str%==test ( set st ...

  2. 批处理之坑爹的感叹号和变量延迟扩展

    https://www.cnblogs.com/ini_always/archive/2012/02/16/2355031.html 转载于:https://www.cnblogs.com/vana/ ...

  3. 变量延迟(setlocal)之浅见

    变量延迟,浅见认为就是变量预处理,在事先声明变量,告诉cmd环境哪个先哪个后.默认情况下是停用,可以用两种方法启用/停用: 一.cmd /v:on 和cmd /v:off ,范围在cmd这个环境直至e ...

  4. cmd批处理命令与变量(下)

    批处理命令与变量 1:for命令及变量 基本格式: FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单 ...

  5. SQL Server 2019中SQL表变量延迟编译

    In an article, An overview of the SQL table variable, we explored the usage of SQL table variables i ...

  6. 第4章 批处理中的变量

    批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量" 我们现在来详解这两个变量! 一.系统变量 他们的值由系统将其根据事先定义的条件自动赋值,也就 ...

  7. windows变量延迟_Windows 10的2018年10月更新可能推迟到11月(这就是原因)

    windows变量延迟 Microsoft stopped offering Windows 10's October 2018 Update on October 6, as it was dele ...

  8. Shell基础(一):Shell基础应用、简单Shell脚本的设计、使用Shell变量、变量的扩展应用...

    一.Shell基础应用 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 切换用户的Shell环境        2> 练习命令历史.命令别名        ...

  9. windows 批处理设置环境变量

    windows通过批处理设置环境变量 CreateTime--2017年8月4日11:28:11 Author:Marydon 参考链接:https://wenku.baidu.com/view/ae ...

最新文章

  1. mysql可以做日期处理吗_mysql可以做日期处理吗
  2. 深度好文 — 微服务和API网关限流熔断实现关键逻辑思路
  3. 模仿大脑:下一代计算机
  4. python就业方向及工资-Python的就业方向有哪些?
  5. Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别
  6. Objective-C中的self和super
  7. react 最佳实践_最佳React教程
  8. 微服务 松耦合_超值干货:微服务架构下如何解耦,对于已经紧耦合下如何重构?...
  9. 【飞控理论】【惯性导航基础】什么是欧拉角?为什么会有欧拉角?欧拉角在航空领域的运用?
  10. 无人驾驶的规划与控制(四)——反馈控制
  11. enumerate取下标
  12. chm格式怎么打开?
  13. Arduino ide配置esp32硬件支持(配置esp32的arduino开发环境)
  14. FLV视频合并-JAVA代码
  15. 关于萨蒂亚·纳德拉安全演讲你所要知道的
  16. 如何制作校园平面图及路线导图
  17. 微信小程序 常用组件
  18. 【优化选址】基于人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码
  19. python 字典的学习
  20. 为你的SQLite开发选择一款比较好的工具

热门文章

  1. 神经网络训练之数据归一化处理
  2. 动手学深度学习第九节softmax回归中FashionMNIST数据集无法加载的解决方法
  3. navicat连接堡垒机的MySQL
  4. OpenBCI_GUI部件指南
  5. 2022-2028全球与中国农业土壤检测服务市场现状及未来发展趋势
  6. 机器人离线编程画圆误差解决方案_机器人离线编程的误差来源分析与消除办法...
  7. css进阶01 |CSDN创作打卡
  8. Centos7中systemd-journald占用内存过高的解决办法
  9. 盘点:计算机专业含金量最高的证书!只需一种证书在手,从此不愁
  10. 进击的爬虫-003-beautifulsoup实现猫眼电影前100爬取