cmd的功能实在太少了,很多功能都需要自己实现。
“动态创建和读取变量”可以实现类似表格的效果,以及更多东西。
常识:使用for
命令时,如果直接在cmd窗口中执行,for
自带的变量前只有1个%
,写在脚本中执行,则需要有2个%
。
1.创建
cmd对变量的处理是这样的:
以这条命令为例:(k=abc
)
echo %k%777
1.识别有没有变量标记:%%
。(如果执行过setlocal enabledelayedexpansion
,变量标记为!!
)
…本例中找到了%k%
,有变量k
。
2.若找到了变量标记,搜索这个变量是否存在,值是多少。
…本例中找到了k
的值abc
。
3.若找到了变量值,将命令中的变量替换为变量值。
…本例中将k
替换为abc
。
4.执行经过了替换的指令。
…本例最终执行的命令为:
echo abc777
cmd中设置变量用set
,所以我们可以像这样动态设置变量:
for /l %n in (1,1,7) do (
set num%n=%n
)
只执行set
而不带参数可以查看目前所有变量,执行上面命令后查看,我们会发现多出了这些变量:
num1=1
num2=2
num3=3
num4=4
num5=5
num6=6
num7=7
动态设置变量,直接在set
命令里加变量即可。
2.读取
上面描述的cmd处理变量的过程中,变量标志%%
是不分左右的。cmd读取到一个%
时,它会等待第二个%
。当读取到第二个%
时,它就会将两个%
之间的部分认作变量名。
这也就意味着,当你试图通过%num%k%%
(k=1
)来实现读取num1
的值时,cmd读到的事实上是%num%
k
%%
,因此直接调用动态变量行不通。
这时我们要用到set
的另一个用法:在set
后加一个不带等号的字符串,它就会查找当前存在的名称中包含这个字符串的变量。所以我们可以这么做:
set num%k%
就可以得到回显:
num1=1
再用for /f
读取回显:
for /f "tokens=2* delims==" %s in ('set num%k%') do (echo %s)
这样就可以将动态变量的值传入%s
。然后我们就可以创建其他的变量,将动态变量的值传出去,或者直接在for
中使用。
示例:(接上面“读取”中的例子)
for /l %n in (1,1,7) do (
for /f "tokens=2* delims==" %s in ('set num%n') do (echo %s)
)
得到输出:
1
2
3
4
5
6
7