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

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 offsetlocal 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=%~1set username=%~2set password=%~3echo %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的值。。。

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

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

    先来说说变量延迟扩展吧.当然,放狗一搜,就能看到满天飞的关于变量延迟扩展的文章,所以,我这里就简单介绍一下.先来看一段批处理: 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. Windows批处理常见问题总结

    批处理常见问题总结 详细请看视频:https://edu.csdn.net/course/detail/31305 1.Q:我在网上发现了一段批处理代码,要怎样处理才能使它运行起来? A:批处理是解释 ...

  4. bat(续六)-windows批处理set命令

    windows批处理set命令 [设置变量] 格式:set 变量名=变量值 详细:被设定的变量以%变量名%引用 [取消变量] 格式:set 变量名= 详细:取消后的变量若被引用%变量名%将为空 [展示 ...

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

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

  6. 批处理-嵌套循环、if-else、延迟变量、函数

    批处理-嵌套循环.if-else.延迟变量.函数 :: 设置延迟变量,默认是关闭的 setlocal EnableDelayedExpansion set project=12 set clientI ...

  7. windows批处理学习

    转自:http://blog.csdn.net/chenlycly/article/details/30480609 第一章 批处理基础 第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...

  8. windows批处理命令教程

    原文地址:http://www.cnblogs.com/phyllis/archive/2011/05/19/2051131.html 第一章 批处理基础 第一节 常用批处理内部命令简介 批处理定义: ...

  9. Windows批处理程序编程学习笔记

    Windows批处理学习笔记(基础篇) 第一章 从零开始认识批处理(what why how) 1.1 什么是Windows批处理? 批处理程序全名为 Batch file programming 是 ...

最新文章

  1. Nature:MIT团队造全新声感织物,这件“毛衣”可以听到你的心跳
  2. 比特币现金诞生一周年,BCH的未来在哪?
  3. python模块引用
  4. “加班文化“到底是如何流行起来的
  5. 笔记-高项案例题-2016年上-整体管理+风险管理
  6. 脸部细微表情识别_您可以仅使用面部表情来控制字体吗?
  7. wdcp-apache开启KeepAlive提高响应速度
  8. GPO备份还原复制及导入
  9. C#破解access数据库密码方法
  10. 全球及中国晶圆锯划片刀行业发展态势及投资潜力预测报告2021-2027年
  11. 你根本不会休息(转)
  12. php 中文逗号 转英文,PHP把空格、换行符、中文逗号等替换成英文逗号的正则表达式...
  13. cistern java,basin是什么意思_basin怎么读_basin翻译_用法_发音_词组_同反义词_盆-新东方在线英语词典...
  14. java合并word_java实现合并多个word文档 且可换页 实例代码(基于docx4j)
  15. Pandas 面板Panel
  16. 编写 SQL 查询表格,按创建时间降序排列。
  17. Linuxshell脚本之循环语句
  18. 我做数画ai绘画教程日赚过千,良心分享给想兼职赚钱的人
  19. Google和facebook登录
  20. 多组差异分析的可视化,这样做最省心!

热门文章

  1. rsyslog日志管理+LogAnalyzer
  2. SQL Server中的Merge关键字
  3. 【他们都说 select * 不好,但是 。。。】
  4. java轻量级IOC框架Guice
  5. Uva592 Island of Logic
  6. UML 2.0(装载)
  7. 【C++】explicit 关键字
  8. 理论实践都重要,交换机安装全接触
  9. .net程序员的盲点(八):泛型
  10. 『中级篇』阿里云安装Docker企业版UCP和DTR(59)