《DOS批管理命令.doc》由会员分享,可在线阅读,更多相关《DOS批管理命令.doc(17页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、.-DOS批处理命令批处理(Batch),也称为批处理脚本。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。批处理是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的命令解释器(通常是COMMAND. COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者.cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。更复杂的情况,需要使用if,for,goto等命令控制程序的运行过程,如同C,Basic等中高级语言一样。如果需要实现更复杂的应用,利用外部程序
2、是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理文件可以用记事本直接编辑或用DOS命令创建,也可以用DOS下的文本编辑器Edit.exe来编辑。一般情况下,每条命令占据一行;当然也可以将多条命令用特定符号(如:&、&、|、|等)分隔后写入同一行中;还有的情况就是像if、for等较高级的命令则要占据几行甚至几十几百行的空间。系统在解释运行批处理程序时,首先扫描整个批处理程序,然后从第一行代码开始向下逐句执行所有的命令,直至程序结尾或遇见exit命令或出错意外退出。一、 DOS批处理命令1、 echo命令。打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,将显示当前
3、回显设置。 语法:echo on|off message Sample:echo off / echo hello world 在实际应用中会把这条命令和重定向符号结合来实现输入一些命令到特定的文件中。2、 rem 命令。注释命令,便于别人阅读。: 也具有rem的功能,不同在于:当关闭回显时,rem和:后的内容都不会显示;当打开回显时,rem和rem后的内容会显示出来,然而:后的内容仍然不会显示。 语法:Rem Message Sample:Rem Here is the description.3、 命令。表示不显示后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看
4、到你使用的命令。Sample:echo offecho Now initializing the program,please wait a minite.format X: /q/u/autoset (autoset参数效果和/y是一样的)4、 Goto 命令。指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。语法:goto label (label是参数,指定所要转向的批处理程序中的行。)Sample:if %1= goto noparmsif %2= goto noparms(%1、%2,后面有解释。)Rem check parameters if null show usage
5、:noparmsecho Usage: monitor.bat ServerIP PortNumber 说明goto end标签名字可以随便起,前面加个:用来表示这个字母是标签。5、 pause 命令。暂停命令。运行 Pause 命令时,将显示消息:Press any key to continue. .Sample: echo off :begin copy G:*.* d:back echo 请插入另一张光盘. pause goto begin此例中, G盘上所有文件均复制到d:back中。注释提示您将另一张光盘放入G 盘时,pause 命令会使程序挂起,更换光盘后按任意键继续处理。6、
6、call 命令。从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。语法: call Drive:Path FileName :label arguments FileName 指定要调用的批处理程序名称。filename 参数必须具有 .bat 或 .cmd 扩展名。7、 start 命令。调用外部程序,所有DOS命令和命令行程序都可以由start命令来调用。如:start calc.exe 即可打开Windows的计算器。 常用参数:MIN开始时窗口最小化, SEPARATE在分
7、开的空间内开始 16 位 Windows 程序,HIGH在 HIGH 优先级类别开始应用程序,REALTIME 在REALTIME 优先级类别开始应用程序,WAIT启动应用程序并等候它结束,parameters这些为传送到命令/程序的参数。执行的应用程序是32位GUI应用程序时,CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。8、 set 命令。显示、设置或删除变量。格式:set /a /p variable=sring 显示变量:set 或 set s显示批处理当前所有已定义变量及其值或所有以s开头的变量及值。 设置变量:set aa=abcd 此句
8、命令向变量aa赋值abcd。如果变量aa已被定义,则aa的值被修改为abcd;若aa尚未定义,则此句命令即可定义新的变量aa,同时为变量aa赋予初始值abcd。 删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令为实质意义。 /a指定等式右边的字符串为数字表达式;/p运行将变量数字设成用户输入的一行输入。批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。 set命令具有扩展功能,如用作交互输入
9、、字符串处理、数值计算等,属于高级命令范畴。9、 一般命令文件夹管理cd 显示当前目录名或改变当前目录。 md 创建目录。 rd 删除一个目录。 dir 显示目录中的文件和子目录列表。 tree 以图形显示驱动器或路径的文件夹结构。 path 为可执行文件显示或设置一个搜索路径。 xcopy 复制文件和目录树。文件管理type 显示文本文件的内容。 copy 将一份或多份文件复制到另一个位置。 del 删除一个或数个文件。 move 移动文件并重命名文件和目录。(WinXP Home Edition中没有) ren 重命名文件。 replace 替换文件。 attrib 显示或更改文件属性。
10、find 搜索字符串。 fc 比较两个文件或两个文件集并显示它们之间的不同 网络命令ping 进行网络连接测试、名称解析 ftp 文件传输 net 网络命令集及用户管理 telnet 远程登陆 ipconfig显示、修改TCP/IP设置 msg 给用户发送消息 arp 显示、修改局域网的IP地址-物理地址映射列表 系统管理at 安排在特定日期和时间运行命令和程序 shutdown立即或定时关机或重启 tskill 结束进程 taskkill结束进程(比tskill高级,但WinXPHome版中无该命令) tasklist显示进程列表(Windows XP Home Edition中没有) sc
11、 系统服务设置与控制 reg 注册表控制台工具 powercfg控制系统上的电源设置 对于以上列出的所有命令,在cmd中输入命令+/?即可查看该命令的帮助信息。如find /?10、 choice 命令。可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234.。如: choice /c:dme defrag,mem,end将显示 defrag,mem,endD,M,E? Sample: Sample.bat的内容如下: echo off choice /c:dme defrag,mem,end if errorlevel
12、 3 goto defrag (应先判断数值最高的错误码) if errorlevel 2 goto mem if errotlevel 1 goto end :defrag c:dosdefrag goto end:mem mem goto end :end echo good bye 此文件运行后,将显示 defrag,mem,endD,M,E? 用户可选择d m e ,然后if语句将作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,文件结
13、束。11、12、13、14、15、16、17、18、19、二、 语句格式1、 If。实现条件判断,包括字符串比较、存在判断、定义判断等。通过条件判断,if语句即可以实现选择功能。语法格式如下: 字符串比较IF not string1 compare-op string2 command1 else command2区分大小写。compare-op 操作符含义:=匹配,EQU等于,NEQ不等于,LSS小于,LEQ小于或等于,GTR大于,GEQ大于或等于。选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。echo off set str1=abcd1233 set str2=
14、ABCD1234 if %str1%=%str2% (echo 字符串相同!) else (echo 字符串不相同!) if /i %str1% LSS %str2% (echo str1=str2) echo. set /p choice=是否显示当前时间?(y/n) if /i not %choice% EQU n echo 当前时间是:%date% %time% pausenul 存在判断。存在判断的功能是判断文件或文件夹是否存在。其命令格式为:IF NOT EXIST filename command1 else command2echo off if exist %0 echo 文件
15、%0是存在的! if not exist %df0 (echo 文件夹%df0不存在! ) else echo 文件夹%df0存在! pausenul %0即代表该批处理的全称(包括驱动器盘符、路径、文件名和扩展类型);%df0是对%0的修正,只保留了其驱动器盘符和路径,详情请参考for /?,属高级批处理范畴;注意if语句的多行书写,多行书写要求command1的左括号必须和if在同一行、else必须和command1的右括号同行、command2的左括号必须与else同行、command1和command2都可以有任意多行,即command可以是命令集。 定义判断。判断变量是否存在,即是否
16、已被定义。其命令格式为:IF not DEFINED variable command1 else command2echo off set var=111 if defined var (echo var=%var%) else echo var尚未定义! set var= if defined var (echo var=%var%) else echo var尚未定义! pausenul 结果判断IF NOT ERRORLEVEL number commandERRORLEVEL 是命令执行完成后返回的退出值;Number 退出值的数字取值范围0255。判断时值的排列顺序应该又大到小。返
17、回的值大于或等于指定的值时条件成立。IF ERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL来判断命令的返回值。常见的返回码为0、1。 masm %1.asm if errorlevel 1 pause & edit %1.asm link %1.obj masm %1.asm if not errorlevel 1 link %1.obj pause & edit %1.asm 2、 For。for语句有多个开关,不同开关将会实现不同的功能。 无开关格式:FOR %variable IN (set) DO command%variable 指定一个单一
18、字母可替换的参数。(set) 指定一个或一组文件。可以使用通配符。echo off for %i in (a,b c,d) do echo %i pausenul 开关/L格式:FOR /L %variable IN (start,step,end) DO command其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数。 含开关/L的for语句举例(创建5个文件夹):echo off for /L %i in (1,2,10) do md %i pause上例将新建5个文件夹,文件夹名称依次为1、3、5、7、9。 开关
19、/F能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等。其命令格式为: FOR /F options %variable IN (set) DO command 其中,set为(string、command、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。各选项的意义参见for /f。一般情况下,使用较多的是skip、tokens、delims三个选项。echo off echo 本文件夹里面的文件有: dirc:file.t
20、xt for /f skip=5 tokens=3* delims= %a in (c:file.txt) do ( if not %a= if not %b=字节 if not %b=可用字节 echo %b ) del c:file.txt pause 开关/D或/R。含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹,echo off setlocal enabledelayedexpansion FOR /R d: %i IN (.) DO ( set dd=%i set dd=!dd:0,-1! echo !dd! ) pause exit上例即可以罗列出D盘下的所有
21、文件夹,其速度要比命令tree d:慢多了,不过其返回结果的实用性则远远超过了tree命令。上例中也出现了几个新面孔,如setlocal、感叹号等。其中,感叹号其实就是变量百分号(%)的强化版。之所以要用!而不用%,是因为在for循环中,当一个变量被多次赋值时,%dd%所获取的仅仅是dd第一次被赋予的值;要想刷新dd的值,就必须首先通过命令setlocal enabledelayedexpansion来开启延迟变量开关,然后用!dd!来获取dd的值。eol=c - 指一个行注释字符的结尾(就一个) skip=n - 指在文件开始时忽略的行数。 delims=xxx - 指分隔符集。这个替换了空
22、格和跳格键的默认分隔符集。 tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的 格式为一个范围。通过 nth 符号指定 m 符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之分配并接受行的保留文本。 usebackq - 指定新语法已在下类情况中使用: 在作为命令执行一个后引号的字符串并且引号字符为文字字符串命令并允许在 file-set中使用双引号扩起文件名称。最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 C
23、MD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子: FOR /F usebackq delims= %i IN (set) DO echo %i 会枚举当前环境中的环境变量名称。 另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法: I - 删除任何引号(),扩充 %I %fI - 将 %I 扩充到一个完全合格的路径名 %dI - 仅将 %I 扩充到一个驱动器号 %pI - 仅将 %I 扩充到一个路径 %nI - 仅将 %I 扩充到一个文件名 %xI - 仅将 %I 扩充到一个文件扩展名 %sI - 扩充的路径只含有短名 %aI - 将 %I 扩充到文件的文件属
24、性 %tI - 将 %I 扩充到文件的日期/时间 %zI - 将 %I 扩充到文件的大小 %$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量未被定义,或者没有找到文件,此组合键会扩充空字符串 可以组合修饰符来得到多重结果: %dpI - 仅将 %I 扩充到一个驱动器号和路径 %nxI - 仅将 %I 扩充到一个文件名和扩展名 %fsI - 仅将 %I 扩充到一个带有短名的完整路径名 %dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个驱动器号和路径。 %ftzaI - 将 %I 扩充到类似输出线路的 DI
25、R 在以上例子中,%I 和 PATH 可用其他有效数值代替。% 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。利用For命令来实现对一台目标Win2k主机的暴力密码破解。我们用net use ipipc$ password /u:administrator来尝试这和目标主机进行连接,当成功时记下密码。 最主要的命令是一条:for /f i% in (dict.txt) do net use ipipc$ i% /u:administrator 用i%来表示admin的密码,在dict.txt中这个取i%的值用net use 命令来
26、连接。然后将程序运行结果传递给find命令 for /f i% in (dict.txt) do net use ipipc$ i% /u:administratorfind :命令成功完成D:ok.txt ,这样就ko了。3、4、三、 重定向1、与将输出信息重定向到指定的设备或文件。系统默认输出到显示器。 如:echo aaaaaa.txt 即可将本在显示器上显示的信息aaaaa输出到文件a.txt中,屏幕上没有任何显示。如果文件a.txt本来已经存在,该命令将首先擦除a.txt中的所有信息,然后写入信息aaaaa;若a.txt本来就不存在,该命令即可新建一个a.txt文件,并写入信息aaa
27、aa。 echo aaaaaa.txt 类似于echo aaaaaa.txt。区别在于:如果a.txt本已存在,a.txt会擦除a.txt中的原有内容,而a.txt并不擦除原有内容,仅在a.txt文件的末尾添加信息aaaaa。a.txt不存在时,二者没有差别。2、a.txt echo 请任意输入字符,以回车结束: set /p ifo= cls echo 【 从屏幕获得的输入信息 】 echo %ifo% set /p ifo=nul 四、 管道符号|将管道符号前面命令的输出结果重定向输出到管道符号后面的命令中去,作为后面命令的输入。使用格式为:command_1|command_2echo
28、off echo aaaaa.txt del /p a.txt pause = echo off echo aaaaa.txt echo y|del /p a.txt pause 五、 转义符 将特殊符号转化为一般符号,即剥离特殊符号的特殊地位。特殊符号指:| & ”,直接用命令 echo 是不行的,必须修改为 echo 。其余几个特殊符号类似需要有同样的处理。 转义字符使用举例: = echo off echo aaaaa.txt echo 第一句echo执行完毕 echo aaaaa.txt echo 第二句echo执行完毕 pause = 比较上面的两句echo,第一句echo将信息aa
29、aa输出到了文件a.txt,而第二句echo则在直接屏幕上显示出aaaaa.txt六、 逻辑命令符&、&、|&-它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败; &-当&前面的命令成功执行时,执行&后面的命令,否则不执行; |-当|前面的命令失败时,执行|后面的命令,否则不执行。echo off echo | reg add HKCU /v try /f|echo *成功* reg add HKCU1 /v try /f|echo *失败* echo & reg delete HKCU /v try /f&echo *成功* reg delete HKCU
30、/v try /f&echo *失败* echo & reg delete HKCU /v try /f&echo *成功* reg delete HKCU /v try /f&echo *失败* pause七、 字符串处理1、 截取字符串echo off set ifo=abcdefghijklmnopqrstuvwxyz0 12 3456789 echo 原字符串(第二行为各字符的序号): echo %ifo% echo 1234567890 123 45678901234567890123456 echo 截取前5个字符: echo %ifo:0,5% echo 截取最后5个字符: ec
31、ho %ifo:-5% echo 截取第一个到倒数第6个字符: echo %ifo:0,-5% echo 从第4个字符开始,截取5个字符: echo %ifo:3,5% echo 从倒数第14个字符开始,截取5个字符: echo %ifo:-14,5% pause2、 替换字符串echo off set aa=伟大的中国!我为你自豪! echo 替换前:%aa% echo 替换后:%aa:中国=中华人民共和国% echo aa = %aa% set aa=%aa:中国=中华人民共和国% echo aa = %aa% pause3、 字符串合并echo off set aa=伟大的中国! set
32、 bb=我为你自豪! echo %aa%bb% echo aa=%aa% echo bb=%bb% set aa=%aa%bb% echo aa=%aa% pause4、 扩充字符串I - 删除任何引号(),扩充 %I %fI - 将 %I 扩充到一个完全合格的路径名 %dI - 仅将 %I 扩充到一个驱动器号 %pI - 仅将 %I 扩充到一个路径 %nI - 仅将 %I 扩充到一个文件名 %xI - 仅将 %I 扩充到一个文件扩展名 %sI - 扩充的路径只含有短名 %aI - 将 %I 扩充到文件的文件属性 %tI - 将 %I 扩充到文件的日期/时间 %zI - 将 %I 扩充到文件的
33、大小 %$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串。可组合修饰符来得到多重结果: %dpI - 仅将 %I 扩充到一个驱动器号和路径 %nxI - 仅将 %I 扩充到一个文件名和扩展名 %fsI - 仅将 %I 扩充到一个带有短名的完整路径名 %dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充 到找到的第一个驱动器号和路径。 %ftzaI - 将 %I 扩充到类似输出线路的 DIR = 以上内容引用于for /?帮助信息。其中的I代表变量I,不过需要说明的是
34、,不是所有的变量都能够进行扩充的,有两个条件:1、该字符串代表一个文件路径;2、变量要用%x来表示,x可取a-z A-Z 0-9共62个字符中的任意一个。举例说明: = echo off echo 正在运行的这个批处理: echo 完全路径:%0 echo 去掉引号:%0 echo 所在分区:%d0 echo 所处路径:%p0 echo 文件名:%n0 echo 扩展名:%x0 echo 文件属性:%a0 echo 修改时间:%t0 echo 文件大小:%z0 pause = 其中的%0是批处理里面的参数,代表当前运行的批处理的完全路径。类似的还有%1-%9,分别代表传递来的第1-9个参数。例
35、子如下: = echo off set aa=C:WindowsPPPa.btx call :deal aaa %aa% c c ddd eee pausenul exit :deal echo %0 = %0 echo %1 = %1 echo %2 = %2 echo %3 = %3 echo %4 = %4 echo %5 = %5 = 其中,变量aa在之前是不可以扩充的,通过call命令并将aa作为参数传递给子函数:deal,将aa变量转换成了变量%1,即符合%x格式,从而可以进行字符串扩充。 至于%x中x取a-z A-Z的形式,可以复习一下for语句,for语句里面的变量就是用%x来
36、表示的,因而可以直接进行扩充八、 数值计算只能够进行整型计算。具体格式为“set /a expression”。set支持的运算符及优先级排序如下: = () - 分组 ! - - 一元运算符(逻辑非、按位非、取负) * / % - 算数运算符(乘、除得商、除得余数,即取余) + - - 算数运算符(加、减) - 逻辑移位(左移一位、右移一位) & - 按位“与” - 按位“异” | - 按位“或” = *= /= %= += -= - 赋值 &= = |= = , - 表达式分隔符(set可一次处理多个表达式) = 批处理中取变量的值是需要用%或者!的,而在set /a 中,直接用变量名称即
37、可取得变量的值。另外,set支持八进制(数字前缀0)、十进制(数字无前缀)和十六进制(数字前缀0x),且支持不同进制之间的计算,如set /a a=123+0123+0x123,计算及显示结果为十进制。九、 批处理概念方法(一)环境变量 “环境变量”,就是“变量”的意思。批处理的变量可以分为两类,系统变量和自定义变量。 1、系统变量 操作系统事先定义好的,可以适用于任何批处理的变量为“系统变量”。系统变量有很多个,包括硬件类、操作系统类、文件路径类、系统时间类等。要查看所有的系统变量,请新打开一个cmd窗口,输入set回车即可。对几个比较常用的变量解释如下: ComputerName 计算机名
38、,即右键 我的电脑-属性-计算机名 选项卡中的“完整的计算机名称” ComSpec cmd.exe完整路径名 HomeDrive 系统分区盘符,一般都是C盘,故而HomeDrive=C: Path 可执行文件默认搜索路径。ProgramFiles系统的Program Files的路径,一般都是C:Program Files Prompt 个性化设置cmd提示符的必备武器! SystemDrive 包含系统根目录的分区,其实就是HomeDrive了 SystemRoot 系统根目录路径,一般都是C:WINDOWS Temp、Tmp 文件、程序等可使用的临时目录,默认是C:WINDOWSTemp或
39、Tmp。几乎所有的程序在运行时都会在这个目录里面“临时”写入文件。我们要把它修改到其他分区,并且时时清理。 UserName 当前用户名,即所登陆的账户名 UserProfile 当前用户的配置目录,一般都是C:Documents and Settings%UserName%。默认情况下,我们的桌面就是这个目录下面的“桌面”文件夹;我的文档就是这个目录下面的“My Documents”文件夹。所以啦,往桌面上或我的文档里面放东西就是放到这个文件夹下面了,也就是放到C盘了,重装系统时要覆盖C盘内容的,所以桌面上或我的文档里面的东西当然就会Gone with the Wind了解决方法有两个,一是
40、保持良好的习惯,不把重要文件放到这两个地方;二是,修改默认设置,将这两个文件夹都移到其他分区。 WinDir 操作系统路径,其实就是SystemRoot了 (二)用户变量用户变量由set命令定义。关于set命令的使用,参考set /?。 3、变量引用如何引用变量,即直接用变量名操作变量,通过%或!来获取变量的值。其中,只有在for语句里面重复对同一变量多次赋值时才需要使用!,并且在使用!调用变量时,要首先“启用延迟环境变量扩充”,启动命令为:SetLocal EnableDelayedExpansion。另外需要说明的是,“启用延迟环境变量扩充”后,所有的!都将被视为“取变量值”的特殊符号,即
41、使用!也不能输出符号!。若要输出!,则需要“停用延迟环境变量扩充”,命令为:SetLocal DisableDelayedExpansion (三)参数在调用函数或其他批处理时可能需要传递参数。批处理的参数传递分为直接和间接两种方法。 1、直接传递 使用call命令时不使用任何参数。在子函数或子批处理里面直接对主函数(也称父批处理)里面的变量进行修改。这跟汇编语言里面的参数传递方式类似。 直接传递参数举例: = echo off setlocal enabledelayedexpansion set var=aCdehiM,?mnrstW y echo %var% call :deal setlocal disabledelayedexpansion set var=%var:?=!% echo %var% pausenul exit :deal set tm=!var! set var= for %i in (6,3,11,11,16,15,1,4,11,5,12,13,9,0,12,7,15,14,5,10,2,16,18,8) do ( set var=!var!tm:%i,1! ) goto
限制150内