转自: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. 微信小程序自定义导航栏

    微信小程序需要自定义导航栏,特别是左上角的自定义设置,可以设置返回按钮,菜单按钮,配置如下: 1.在app.json的window属性中增加: navigationStyle:custom 顶部导航栏 ...

  2. 95%的技术面试必考的JVM知识点都在这,另附加分思路!

    概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...

  3. 英语笔记3(git)

    一: To create a new branch and switch to it at the same time, you can run the git checkout command wi ...

  4. Linux 设置自启动服务

     0 为停机,机器关闭.(千万不要把initdefault设置为0 )    1 为单用户模式,就像Win9x下的安全模式类似.    2 为多用户模式,但是没有NFS支持.    3 为完整的多用户 ...

  5. Java String:重要到别人只能当老二的字符串类

    字符串,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思.你比如 ...

  6. 面向切面编程 ( Aspect Oriented Programming with Spring )

    Aspect Oriented Programming with Spring 1. 简介 AOP是与OOP不同的一种程序结构.在OOP编程中,模块的单位是class(类):然而,在AOP编程中模块的 ...

  7. Linux学习笔记(一):常用命令(1)

    经过统计Linux中能够识别的命令超过3000种,当然常用的命令就远远没有这么多了,按照我的习惯,我把已经学过的Linux常用命令做了以下几个方面的分割: 1.文件处理命令 2.文件搜索命令 3.帮助 ...

  8. Java开发知识之Java的正则表达式

    目录 正则表达式 一丶什么是正则表达式 1.正则表达式简介 2.无正则表达式判断代码 3.使用正则表达式代码. 二丶正则表达式API 三丶正则表达式语法格式 1.正则表达式语法 正则表达式 一丶什么是 ...

  9. Haskell复习笔记(二)

    Haskell中的递归 递归就是定义函数以调用自身的方式,关于递归解决问题的实例有很多,如斐波那契数列,还有汉诺塔问题,递归也正是Haskell中用来解决循环问题的关键. 自定义maxinum函数 m ...

  10. Autorelease机制讲解

    Autorelease机制是在iOS内存管理中的一员.在MRC中,是通过调用[obj autorelease]来延迟内存释放:在ARC中,我们已经完全不需要知道Autorelease就能很好地管理好内 ...