转自:https://blog.csdn.net/flyoutsan/article/details/52811095

cmd变量通过set设置变量,通过可以使用set /?查看有关变量的帮助文档。

接下来谈set的用法:

1.set 变量名=值

值可以包含空格、一直到命令结束,也可以是Ctrl+G这种代表警报声的字符(echo输出会发出警报声“滴~”),与echo类似

2.set 变量名

在系统中预定义了一批环境变量(所有的环境变量将附加在博客尾),如最常见的path变量,记录了系统应用程序的默认路径,如果仅仅使用set 变量名,那么将会打印所有以这个变量名开头的变量为的值。例如如果set p,将会打印ProgramFiles, ProgramFIles(X86), path等以p开头的变量的值。如果用户通过set设置了新的变量,如set pt=point那么新变量在这个cmd中将加入环境变量,因此set p也将会打印出pt的值,与环境变量不同的是,该变量只在当前cmd有效,同时对环境变量的更改也只是在当前cmd有效。

3.set /P 变量=提示

变量将通过用户输入接收值,提示作为提示信息输出,例如set /p v=输入v的值:,那么将会出现

输入v的值

(等待输入)

4.set /A 变量=表达式

表达式将被视为算术表达式,变量赋值为算术表达式的值,算术运算符参照帮助文档或者官方网站文档(可以发现,与C语言运算符基本相同):

如果要使用其他变量的值,需要使用%变量名%(或者 !变量名!)来表示该变量。同时0X与0分别表示十六进制与八进制数字。

   +   Add                set /a "_num=_num+5"
+= Add variable set /a "_num+=5"
- Subtract (or unary)set /a "_num=_num-5"
-= Subtract variable set /a "_num-=5"
* Multiply set /a "_num=_num*5"
*= Multiply variable set /a "_num*=5"
/ Divide set /a "_num=_num/5"
/= Divide variable set /a "_num/=5"
% Modulus set /a "_num=5%%2"
%%= Modulus set /a "_num%%=5"
! Logical negation (FALSE) ⇨ (TRUE) and any non-zero value (TRUE) ⇨ (FALSE)
~ One's complement (bitwise negation)
& AND set /a "_num=5&3" AND = (decimal )
&= AND variable set /a "_num&=3"
| OR set /a "_num=5|3" OR = (decimal )
|= OR variable set /a "_num|=3"
^ XOR set /a "_num=5^3" XOR = (decimal )
^= XOR variable set /a "_num=^3"
<< Left Shift. (sign bit ⇨ )
>> Right Shift. (Fills in the sign bit such that a negative number always remains negative.)
Neither ShiftRight nor ShiftLeft will detect overflow.
<<= Left Shift variable set /a "_num<<=2"
>>= Right Shift variable set /a "_num>>=2" ( ) Parenthesis group expressions set /a "_num=(2+3)*5"
, Commas separate expressions set /a "_num=2,_result=_num*5"

5.%变量名:str1=str2%

表示将变量的值中包含的str1使用str2替换后获得的变量,例如

set a="minecraft great!"

echo %a: = is so %

echo %a

此时将会输出:

minecraft is so great!

minecraft great!

这里将空格替换为( is so ),因此输出minecraft is so great!,而%a%依然如故,说明原变量并没有发生变化

6.%变量名(已定义):~start[, length]%

表示从start出开始(包括start,第一个计数为0),取length长的子串,如果length省略,则表示取到串尾,start可以为负数,最后一个字符为-1,从后往前依次为-2、-3、-4……

7.setlocal [Enable|Disable]DelayedExpansion

执行cmd或者bat文件是从头向后执行,变量有一个扩展规则,即在执行一个语句块时变量将会被变量的值代替,例如

set a=hello& echo a

这个语句通过&连接成为一个语句块,又如

(set a=steve

if defined a echo hello %a%)

是通过()组合的一个语句块

在执行语句块时,a将会被a的值所代替,而语句块中的set语句将会在该语句块执行完后才有效,例如

set a=hello

(set a=steve

if defined a echo hello %a%)

将会输出hello而不是steve,可以理解为当前语句块中所有的set都在下一句语句块执行时才有效,在当前语句块不做任何事情

这样将会对程序的逻辑性产生很大的影响,为了解决这个问题,我们可以使用setlocal EnableDelayExpansion。

EnableDelayedExpansion,直接翻译为“启用扩展延迟”,这个我们可以理解为原来的情况是在执行语句块时所有的变量都被扩展为值了,此时还未执行set命令,而启用后,扩展被延迟到语句块执行结束时,此时set命令已经执行,原来变量的值已经被set为了新的值,因此set已经生效。注意,启用后变量的调用将会变为!变量名!,如果使用%变量名%,调用的将会是未使用扩展延迟的状态的变量(即与原来没什么区别),与之相对的还有setlocal DisableDelayedExpansion,为相反的效果。

当执行这个命令后,在执行endlocal之前,setlocal将会一直生效,因此EndLocal就是将setlocal的效果“终结”的命令,使用后,setlocal(无论enable还是disable),效果都将end,一个setlocal对应一个endlocal。

预处理机制:批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。在不启用变量延迟,也不对变量动态捕获其扩展变化时,变量在预处理阶段不作改变

setlocal enabledelayedexpansion ,就是启用变量延迟,我们可以形象的认为是启用了“对变量动态捕获扩展变化”。而 ! 括起来的变量,就是要动态捕获扩展的目标变量,如果不需要,可以继续使用 % 括变量。

示例:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set var=
for /l %%i in ( ) do (
set var=%%i rem 启用延缓环境变量
echo !var! .... rem 未启用延缓环境变量
echo %var%
)

8.setlocal [Enable|Disable]Extensions

启用或者禁用Extension,部分cmd命令拥有启用Extension后的“额外”功能,如果没有启用,那么功能不可用,如if。

9.setlocal

setlocal将表示setlocal后直到endlocal,所有的变量都是局部变量,例如

@echo off
set b=1
setlocal
set b=2
setlocal 
set b=3
set c=hi
echo %b% %c%
endlocal
echo %b% 
if defined c echo %c%
endlocal
if defined c echo %b% %c%

输出为

3 hi

2

又如:

@echo off
set a=
setlocal
set a=
setlocal
set a=
set c=
echo %a% %c%
endlocal
echo %a%
endlocal
echo %a%
pause

输出:

10.for %i in (set) do

在文件(bat或者cmd)中需要将%i使用%%i来代替,%%i不会出现变量扩展的问题,在循环中同步更新%%i的值(谢天谢地,一切正常)

11.bat/cmd文件 + 参数1 + 参数2 + 参数3 + ……

通过%1,%2,%3表示对参数1、2、3……的引用,%0表示bat文件的绝对路径+文件名,如C:\Users\Administrator\Desktop\test.bat

12.系统预定义环境变量表直接输入 set 后可以获得

cmd的变量总结的更多相关文章

  1. cmd 环境变量设置方法详细解释

    cmd设置环境变量可以方便我们bat脚本的运行,但是要注意的是变量只在当前的cmd窗口有作用(局部生效),如果想要设置持久的环境变量需要我们通过两种手段进行设置:一种是直接修改注册表,另一种是通过我的 ...

  2. cmd 环境变量设置的简单方法

    1.查看当前所有可用的环境变量:输入 set 即可查看. 2.查看某个环境变量:输入 “set 变量名”即可,比如想查看temp变量的值,即输入 set temp 3.修改环境变量 :输入 “set ...

  3. cmd启动JMeter

    <配置cmd当前变量启动JMeter> 前因: 不想配置当前windows的环境变量,减少配置污染,故自己写一个启动脚本.每次启动直接双击就可以了. 启动脚本和目录结构是下面这样的: 脚本 ...

  4. Powershell对象选择,排序和变量存储

    PowerShell基础教程(17)——对象的选择.排序和变量存储 可以使用 Select-Object cmdlet 来创建新的.自定义的 Windows PowerShell 对象,后者包含的属性 ...

  5. win10安装nodejs,修改全局依赖位置和环境变量配置

    为什么要修改nodejs全局依赖位置? nodejs全局依赖安装默认位置在C盘,导致C盘文件太大,影响电脑运行速度. 步骤: 安装nodejs(在node官网下载并安装) 查看nodejs版本(在命令 ...

  6. 【python自动化第二篇:python入门】

    内容概览 模块 python运行过程 基本数据类型(数字,字符串) 序列类型(列表,元组,字典) 模块使用 模块我们可以把它想象成导入到python以增强其功能的一种拓展.需要使用import来导入模 ...

  7. ionic的安装

    一.学习一样新的框架的步骤: 1.先找到人家的网站, 一个个点过来看看 2.我们前端的框架,分css与js 3.先学css 再学js 4.要学会复制黏贴代码, 实际演练代码的效果 二.ionic环境安 ...

  8. 【RL-TCPnet网络教程】第32章 RL-TCPnet之Telnet服务器

    第32章      RL-TCPnet之Telnet服务器 本章节为大家讲解RL-TCPnet的Telnet应用,学习本章节前,务必要优先学习第31章的Telnet基础知识.有了这些基础知识之后,再搞 ...

  9. 原创python:windows解决genymotion appium adb 的问题。

    首先请安装好genymotion 与并用其下载好要用的安卓版本. (其中Oracle VM VirtualBox可以自己单独安装也可以在下载genymotion时选择包含vbox的) 参考https: ...

随机推荐

  1. linux入门--Linux系统的优缺点

    1) 大量的可用软件及免费软件 Linux 系统上有着大量的可用软件,且绝大多数是免费的,比如声名赫赫的 Apache.Samba.PHP.MySQL 等,构建成本低廉,是 Linux 被众多企业青睐 ...

  2. postgresql 删除库的时候报错database "temp_test_yang" is being accessed by other users

    删除库的时候报错 ERROR: database "temp_test_yang" is being accessed by other usersDETAIL: There ar ...

  3. centos7中安装、配置、验证、卸载redis

    本文介绍在centos7中安装.配置.验证.卸载redis等操作,以及在使用redis中的一些注意事项. 一 安装redis 1 创建redis的安装目录 利用以下命令,切换到/usr/local路径 ...

  4. Unity GC 优化要点

    参考:http://blog.csdn.net/znybn1/article/details/76464896 为啥要点?因为讲的重点. 游戏运行时来存储数据,当这些数据不再被使用时,存储这些数据的内 ...

  5. Python:数据可视化pyecharts的使用

    什么是pyecharts? pyecharts 是一个用于生成 Echarts 图表的类库. echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化.pyecharts 是一个用于生 ...

  6. 基础才是重中之重~Dictionary<K,V>里V的设计决定的性能

    回到目录 字典对象Dictionary<K,V>我们经常会用到,而在大数据环境下,字典使用不当可能引起性能问题,严重的可能引起内在的溢出! 字典的值建议为简单类型,反正使用Tuple< ...

  7. React Native (二) ios打包到真机

    每当在模拟器上完成了开发,都想到真机上试试,正好前段时候淘了一个imac. 这里就以打包rndemo到iphone为例,讲一下react ntive ios打包到真机的流程. 一.前置 1.有个iph ...

  8. 【Linux】Rsync的剖析与使用

    目录 Rsync的工具剖析与使用 0.Rsync的介绍 1.Rsync的特性 2.Rsync的部署安装 3.搭建远程备份系统. Rsync的工具剖析与使用 0.Rsync的介绍 rsync是Linux ...

  9. CAN总线学习记录之三:总线中主动错误和被动错误的通俗解释

    首先建议把广泛使用的"主动错误"和"被动错误"概念换成"主动报错"和"被动报错". 1. 主动报错站点 只要检查到错误, ...

  10. Spark框架详解

    一.引言 作者:Albert陈凯链接:https://www.jianshu.com/p/f3181afec605來源:简书 Introduction 本文主要讨论 Apache Spark 的设计与 ...