批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[原创] 【续】[一日一教学](44)设置变量:set

本帖最后由 Hello123World 于 2011-12-22 17:35 编辑

【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html
【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html


帮助信息:
  1. 显示、设置或删除 cmd.exe 环境变量。
  2. SET [variable=[string]]
  3.   variable  指定环境变量名。
  4.   string    指定要指派给变量的一系列字符串。
  5. 要显示当前环境变量,键入不带参数的 SET。
  6. 如果命令扩展被启用,SET 会如下改变:
  7. 可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
  8. SET 命令已使用的名称的所有变量的值。例如:
  9.     SET P
  10. 会显示所有以字母 P 打头的变量
  11. 如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
  12. 设置成 1。
  13. SET 命令不允许变量名含有等号。
  14. 在 SET 命令中添加了两个新命令行开关:
  15.     SET /A expression
  16.     SET /P variable=[promptString]
  17. /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
  18. 评估器很简单并以递减的优先权顺序支持下列操作:
  19.     ()                  - 分组
  20.     ! ~ -               - 一元运算符
  21.     * / %               - 算数运算符
  22.     + -                 - 算数运算符
  23.     << >>               - 逻辑移位
  24.                        - 按位“与”
  25.     ^                   - 按位“异”
  26.     |                   - 按位“或”
  27.     = *= /= %= += -=    - 赋值
  28.       &= ^= |= <<= >>=
  29.     ,                   - 表达式分隔符
  30. 如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
  31. 引号扩起来。在表达式中的任何非数字字符串键作为环境变量
  32. 名称,这些环境变量名称的值已在使用前转换成数字。如果指定
  33. 了一个环境变量名称,但未在当前环境中定义,那么值将被定为
  34. 零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
  35. 来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
  36. 那么它显示该表达式的最后值。该分配的操作符在分配的操作符
  37. 左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
  38. 有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022
  39. 相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
  40. 因为 8 和 9 不是有效的八进制位数。(& )
  41. /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
  42. 行之前,显示指定的 promptString。promptString 可以是空的。
  43. 环境变量替换已如下增强:
  44.     %PATH:str1=str2%
  45. 会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
  46. 要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
  47. "str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
  48. 开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
  49. 也可以为扩展名指定子字符串。
  50.     %PATH:~10,5%
  51. 会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
  52. 移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
  53. 值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
  54. 使用的数字则是环境变量数值长度加上指定的偏移量或长度。
  55.     %PATH:~-10%
  56. 会提取 PATH 变量的最后十个字符。
  57.     %PATH:~0,-2%
  58. 会提取 PATH 变量的所有字符,除了最后两个。
  59. 终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
  60. 停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
  61. 请参阅 CMD /?
  62. 考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
  63. 变量扩充是很有用的,而不是执行的时候。以下例子说明直接
  64. 变量扩充的问题:
  65.     set VAR=before
  66.     if "%VAR%" == "before" (
  67.         set VAR=after
  68.         if "%VAR%" == "after" @echo If you see this, it worked
  69.     )
  70. 不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
  71. 的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
  72. 复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
  73. "after",这两者永远不会相等。同样,以下这个例子也不会达到
  74. 预期效果:
  75.     set LIST=
  76.     for %i in (*) do set LIST=%LIST% %i
  77.     echo %LIST%
  78. 原因是,它不会在目前的目录中建立一个文件列表,而只是将
  79. LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
  80. FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
  81. 是空的。因此,我们真正执行的 FOR 循环是:
  82.     for %i in (*) do set LIST= %i
  83. 这个循环继续将 LIST 设成找到的最后一个文件。
  84. 延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
  85. 时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
  86. 例子写成以下所示,以达到预期效果:
  87.     set VAR=before
  88.     if "%VAR%" == "before" (
  89.         set VAR=after
  90.         if "!VAR!" == "after" @echo If you see this, it worked
  91.     )
  92.     set LIST=
  93.     for %i in (*) do set LIST=!LIST! %i
  94.     echo %LIST%
  95. 如果命令扩展被启用,有几个动态环境变量可以被扩展,但
  96. 不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,
  97. 这些变量数值都会被动态计算。如果用户用这些名称中任何
  98. 一个定义变量,那个定义会替代下面描述的动态定义:
  99. %CD% - 扩展到当前目录字符串。
  100. %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。
  101. %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。
  102. %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。
  103. %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。
  104. %CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。
  105. %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。
复制代码
.


命令概括:

set,意为“设置”。
variable,意为“变量”;
/a,arithmetic,意为“算术”(感谢demon的英文提供)。
/p,prompt,意为“提示”;


参数详解:

先从光杆的set命令说起。

1.显示当前所有环境变量

输入:
  1. set
复制代码
.

效果:
  1. ALLUSERSPROFILE=C:\ProgramData
  2. APPDATA=C:\Users\helloworld\AppData\Roaming
  3. CommonProgramFiles=C:\Program Files\Common Files
  4. COMPUTERNAME=HELLOWORLD-PC
  5. ComSpec=C:\Windows\system32\cmd.exe
  6. FP_NO_HOST_CHECK=NO
  7. HOMEDRIVE=C:
  8. HOMEPATH=\Users\helloworld
  9. LOCALAPPDATA=C:\Users\helloworld\AppData\Local
  10. LOGONSERVER=\\HELLOWORLD-PC
  11. NUMBER_OF_PROCESSORS=2
  12. OS=Windows_NT
  13. Path=C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;C:\Program Files\Windows Live\Shared
  14. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
  15. PROCESSOR_ARCHITECTURE=x86
  16. PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 13, GenuineIntel
  17. PROCESSOR_LEVEL=6
  18. PROCESSOR_REVISION=0f0d
  19. ProgramData=C:\ProgramData
  20. ProgramFiles=C:\Program Files
  21. PROMPT=$P$G
  22. PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
  23. PUBLIC=C:\Users\Public
  24. SESSIONNAME=Console
  25. SystemDrive=C:
  26. SystemRoot=C:\Windows
  27. TEMP=C:\Users\HELLOW~1\AppData\Local\Temp
  28. TMP=C:\Users\HELLOW~1\AppData\Local\Temp
  29. USERDOMAIN=helloworld-PC
  30. USERNAME=helloworld
  31. USERPROFILE=C:\Users\helloworld
  32. windir=C:\Windows
复制代码
.


2.显示以指定字符串开头的环境变量

显示以“p”开头的环境变量。
代码:
  1. set p
复制代码
.

效果:
  1. Path=C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Windows\syst
  2. em32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v
  3. 1.0\;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;C:\Program File
  4. s\Windows Live\Shared
  5. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
  6. PROCESSOR_ARCHITECTURE=x86
  7. PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 13, GenuineIntel
  8. PROCESSOR_LEVEL=6
  9. PROCESSOR_REVISION=0f0d
  10. ProgramData=C:\ProgramData
  11. ProgramFiles=C:\Program Files
  12. PROMPT=$P$G
  13. PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
  14. PUBLIC=C:\Users\Public
复制代码
.

显示以“path”开头的环境变量。
代码:
  1. C:\Users\helloworld\Desktop>set path
复制代码
.


效果:
  1. Path=C:\Program Files\Common Files\Microsoft Shared\Windows Live;C:\Windows\syst
  2. em32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v
  3. 1.0\;C:\Program Files\Common Files\Thunder Network\KanKan\Codecs;C:\Program File
  4. s\Windows Live\Shared
  5. PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
复制代码
.



3.直接给变量赋值

变量有两个属性,一是变量名,二是变量值。

建议使用c语言的变量名命名规则:“只能由数字、下划线、字母构成,且不能以数字开头”!

批处理中变量名不能以数字开头,且变量名中不能含有“=”,其它可以随意(脚本的好处,也是脚本的坏处)。

代码:
  1. @echo off
  2. Set a=hello world
  3. echo %a%
  4. pause>nul
复制代码
.

将字符串“hello world”赋值给变量a,并输出变量a的值。

“=”左边是变量名,“=”右边是变量的值。



4.等待用户输入变量值

这一节讲的就是/p参数的常规运用。

代码:
  1. @echo off
  2. net start Schedule
  3. ::开启at服务
  4. Set /p stime=请输入定时关机时间(例如:23:59):
  5. at %stime% shutdown /s /t 0
  6. pause
复制代码
.

这个代码的作用就是,等待用户输入一个时间,然后就会在指定时间关机。

前面说过“=”右边的是变量值,但是这里却不是变量值,而是提示信息,用户输入的字符串才是变量值,因为在set 中加了 /p参数!



5.set的计算功能

set的计算功能可以说是set中最繁杂的一种功能,但你不能不承认——它确实很强大。

①.怎么进行加减乘除?
代码:
  1. @echo off
  2. ::加
  3. Set /a n1=1+1
  4. ::减
  5. Set /a n2=2-1
  6. ::乘
  7. Set /a n3=2*3
  8. ::除
  9. Set /a n4=8/2
  10. echo 和:%n1%,差:%n2%,积:%n3%,商:%n4%
  11. pause>nul
复制代码
.

可以看出,不论进行哪一种算术运算都含有/a参数,其实不仅仅是算术运算,所有的运算都离不开/a参数。

②.怎么求余数(取模)?

批处理中有一项专门用来求余数的运算符“%”。

在命令行下:
  1. C:\Users\helloworld\Desktop>set /a 9%4
  2. 1
复制代码
.

在批处理文件中:
  1. @echo off
  2. Set /a n=9%%4
  3. echo %n%
  4. pause>nul
复制代码
.

可能有人会问:“为什么一个运算符,在命令行和批处理文件中会出现不同的写法呢”,其实写法还是没有变的,都是“%”,只不过%符号比较特殊,在批处理中要先进行一次转义(而%又只能用%转义),看到这里可能你还是不明白,这里可以做一个实验——实验要求:输出一个%。

在命令行下:
  1. C:\Users\helloworld\Desktop>echo %
  2. %
复制代码
.

在批处理文件中:
  1. @echo off
  2. echo %%
  3. pause>nul
复制代码
.


③.复合算术运算符

复合运算符一共有10个,其中复合算术运算符有5个,它们分别是“+=,-=,*=,/=,%=”。

复合运算符只要使用得当,可以很好的节省代码量。

先看一个例子:

计算1-100这100个数字的和。
  1. @echo off
  2. Set n=0
  3. for /l %%i in (1 1 100) do Set /a n=n+%%i
  4. echo %n%
  5. pause>nul
复制代码
.

这个代码中Set /a n=n+%%i,第二个n的两边没有“%”,按照常规,变量在引用时,要在变量名两边加上“%”——set /a的特性就是在引用变量时,可以省略 “%”(当然你也可以不省略——但强烈建议你省略)。

用复合算术运算符简写:
  1. @echo off
  2. Set n=0
  3. for /l %%i in (1 1 100) do Set /a n+=%%i
  4. echo %n%
  5. pause>nul
复制代码
.

对比两个代码,唯一的差别就是 n=n+%%i 与 n+=%%i。

难道n+=%%i就是 n=n+%%i的意思?

事实上也是如此,而且5个复合算术运算符都是这种意思。

“变量1 复合运算符 变量2” 就等于“变量1=变量1 对应的算术运算符 变量2”。

例如:
n*=3 就是 n=n*3。


建议新手跳过第④小节的讲解,免得转的头晕。

④.位运算符

前面讲解的运算符都是对于字节的运算,但是位运算符却是对于更小的单位——位,进行运算(1字节=8位)。

进行位运算符的学习,需要对2进制有所了解,懂得简单的 10进制 to 2进制 的相互转换,而且要对原码、反码、补码的概念有所了解。

10进制=(8位)2进制补码:

9=0000 1001
5=0000 0101
-9=1111 0111

④.1.按位与运算符(&)

没错,它和and(echo hello & echo world)一摸一样,但是在此处它是按位与(Set /a 9^&5)。

这里,为了方便后面的教学,我们暂且将1称为真,0称为假。
  1. C:\Users\helloworld\Desktop>set /a 9^&5
  2. 1
  3. C:\Users\helloworld\Desktop>set /a -9^&5
  4. 5
复制代码
.

为什么写成^&?

跟前面的求余数运算符是一样的道理,由于&符比较特殊,所以需要转义(%必须由%转义,&必须要^转义)。

9和5、-9和5按位与的结果分别为1,5,Why?

位运算就是要用10进制数对应的二进制补码进行运算,然后再将运算得到的二进制补码换算成10进制数输出(这是计算机本身特性决定的,不知道你还记不记的大明湖畔的夏雨荷——计算机科学的基础就是:0,1)。

9: 0000 1001
&
5: 0000 0101
---------------------
1: 0000 0001

-9:1111 0111
&
+5:0000 0101
---------------------
+5:0000 0101

按位与运算,就是“同真为真,其余为假”,在同一位上都是1运算结果才是1,其余都是0.


④.2.按位或运算符(|)

“|”符号在set /a 之外还有“管道”的用法,但是在set /a 中它只是按位或(由于|符号的特殊性,在运用时也要在前面加转义符——^|)。


.
  1. C:\Users\helloworld>set /a 5^|9
  2. 13
  3. C:\Users\helloworld>set /a 5^|-9
  4. -9
复制代码
.


9: 0000 1001
|
5: 0000 0101
---------------------
13: 0000 1101

-9:1111 0111
&
+5:0000 0101
---------------------
-9:1111 0111


按位或运算,就是“一真便真,全假才假”,同一位上只要一个是1,那结果就是1,只有全部是0,结果才是0.

结合前面的按位与(&)运算来看,其实按位与(&)和按位或(|)就是一种比较运算,比较同一位上的0或1的异同,得出结果。


④.3.逻辑移位

逻辑移位运算符有两个:<< ,>>,分别表示向左移位,向右移位。

向左移位(<<)
  1. C:\Users\helloworld\Desktop>set /a 9^<^<2
  2. 36
复制代码
.


9: 0000 1001
<<
2
---------------------
36: 0010 0100  

把二进制补码向左移动两位(不足的在右边补零),然后换算成10进制数得出结果(向左移是将数变大)。

语法:set /a 被移数<<移位数


计算公式:结果=被移数*(2的移位数次方)

例如:9<<2 == 9*(2的2次方) ==36



向右移位(>>)
  1. C:\Users\helloworld\Desktop>set /a 9^>^>2
  2. 2
复制代码
.


9: 0000 1001
>>
2
---------------------
2:  0000  0010

把二进制补码向右移动两位(多余的剔除——这里剔除了最后一个1),然后换算成10进制数得出结果(向右移是将数变小)。

语法:set /a 被移数>>移位数


计算公式:结果=被移数/(2的移位数次方)

例如:9>>2 == 9/(2的2次方) == 2

逻辑移位运算符的特性可以加以利用,来计算数值的偶数倍、偶数半:


比如 9 的 2倍,即 Set /a 9^<^<1

比如 9 的 1/2,即 Set /a 9^>^>1



④.4.按位异或运算符(^)
按位异或运算符也是个特殊符号(转义符),所以在使用的时候也要转义(^^)。
  1. C:\Users\helloworld\Desktop>Set /a 9^^5
  2. 12
  3. C:\Users\helloworld\Desktop>Set /a -9^^5
  4. -14
复制代码
.



9: 0000 1001
^
5: 0000 0101
---------------------
12: 0000 1100

-9:1111 0111
^
+5:0000 0101
---------------------
-14:1111 0010

按位异或运算,就是“不同为真,相同为假”,相同位都是1或都是0,结果就是0,其余结果都是1.




④.5.复合位运算

结合前面的复合算术运算符和位运算符,复合位运算就不难理解。


例如:(&=)运算符
  1. @echo off
  2. Set n1=9
  3. Set /a n1^&=5
  4. echo %n1%
  5. pause
复制代码
.

结果为1。

所以,“n1^&=5”就相当于“n1=n1^&5”(“&”需要转义)。

同理,“ n1^^=5”就相当于“n1=n1^^5”;"n1^|=5"就相当于“n1=n1^|5”

"n1^<^<=2"就相当于“n1=n1^<^<2”.

位运算就在这里结束了,其中“! ~ -   ”这三个 “一元运算符”都没有讲解。



6.逗号运算符

如果两个变量的值都是数字,而不是字符串,就可以用set /a 中的逗号运算符一次性赋值。

例子:
  1. @echo off
  2. Set /a a1=5,a2=5
  3. echo %a1% %a2%
  4. pause
复制代码
.

结果:
  1. 5 5
复制代码
.

如果变量值是字符串,用这种方法就会出错。

例如:
  1. @echo off
  2. Set /a a1=5,a2=5a
  3. echo %a1% %a2%
  4. pause
复制代码
.

结果:
  1. 无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
  2. 八进制(021)。
  3. 5
复制代码
.

只输出了a1的值,a2没有输出,因为a2的值是字符串。

看起来像字符串的16进制数。

例如:
  1. @echo off
  2. Set /a a1=5,a2=0x15
  3. echo %a1% %a2%
  4. pause
复制代码
.

结果:
  1. 5 21
复制代码
.

“0x15”中0x是16进制数前缀(等于10进制数21)。
"015"中0是8进制数前缀(等于10进制数13)。



7.替换变量中的字符串

①.将变量中指定字符串替换成其它字符串

例如:
将字符串中的“o”替换为“-”。
  1. @echo off
  2. Set str=helloworld
  3. Set str=%str:o=-%
  4. echo %str%
  5. pause
复制代码
.

结果:
  1. hell-w-rld
  2. 请按任意键继续. . .
复制代码
.


②.异样替换,删除变量中的指定字符串

删除变量中的指定字符串其实就是将指定字符串替换为空值。

例如:
将字符串中的“o”删除。
  1. @echo off
  2. Set str=helloworld
  3. Set str=%str:o=%
  4. echo %str%
  5. pause
复制代码
.

结果:
  1. hellwrld
  2. 请按任意键继续. . .
复制代码
.

字符串替换还支持通配符“*”。
例如:
将第一个字符“o”前面的字符(包括“o”)全部删除。
  1. @echo off
  2. Set str=helloworld
  3. Set str=%str:*o=%
  4. echo %str%
  5. pause
复制代码
.

结果:
  1. world
复制代码
.


8.截取字符串

截取字符串就是将一个字符串中指定的部分提取出来。

例如,我要截取字符串“一二三四五六七八九十”中的“三四五”,有四种写法:
  1. @echo off
  2. Set a=一二三四五六七八九十
  3. Set a1=%a:~2,3%
  4. Set a2=%a:~2,-5%
  5. Set a3=%a:~-8,3%
  6. Set a4=%a:~-8,-5%
  7. echo %a1% %a2% %a3% %a4%
  8. pause
复制代码
.

为什么这四种写法都能实现要求?
要解释会有很多种说法,我这里只能给出一句记忆口诀:
第一数,起始点。正左右,负右左。偏移!
第二数,结束点。正左右,负右左。终止!


解释第一句:“第一数,起始点。正左右,负右左。”就是“第一个数是起始点,如果是正数就从左往右数,如果是负数就从右往左数”。

以这一句为例,“Set a1=%a:~2,3%”

2是第一个数,而且是正数,所有从左往右数2个数:一二,“偏移!”就是移位。——起始点!

3是第二个数,也是正数,所有也从左往右数(从起始点开始数)3个数,三四五,“终止”!——终止点!


9.“输入光杆set,不会显示出来的”环境变量

%CD% - 扩展到当前目录字符串。

%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

%CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。

%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。














扩展阅读:

a也许是arithmetic的缩写吧。
1

评分人数

TOP

写教程最好结合参考英文版的帮助,chcp 437。

TOP

提示: 作者被禁止或删除 内容自动屏蔽

TOP

@echo off
set n=0
for /l %%i in (1,1,100) do set /a n=%n%+%%i
echo %n%
pause>nul

echo %n%
echo 100
n的值未被代入。
直到最后一条for命令执行完毕,期间%n%的值都是0
因此%n%两边的%非拿掉不可。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

标题

本帖最后由 amwfjhh 于 2014-12-4 12:37 编辑

回复 5# 慕夜蓝化
    你这是变量延时问题。去掉%是set的语法特性,相当于给变量名开了绿灯,正常调用变量在语句块内不开变量延时有话是距其(语句块)最近一次赋值的值。这里累加还可以写成set /a n+=%%i,是合法赋值语句之一。

TOP

给版主提个小小的修改意见:
在批处理代码中,除了%属于加载就要被强制处理而必须写成%%外,其它几个按拉运算符除了可以被^转义外,还可以被""转义而保持其原始样貌。
  1. set /a "a=9^5"
  2. set /a "a=9|5"
  3. set /a "a=9&5"
复制代码
都是有效运算。帮助里面其实更崇这种用法,可以在命令行与批处理中保持一致性。
1

评分人数

TOP

回复 7# amwfjhh


    这些是不是都默认计算2进制?
不熟悉2进制的是不是用不起来了?

TOP

本帖最后由 qixiaobin0715 于 2020-11-6 15:50 编辑

字符替换中如何将变量值中的等号替换掉。

TOP

返回列表