-
批处理中的变量和参数(二)
二、自定义变量
一般用 set 读入的方法定义和赋值
1、程序里设置变量
set var=Hello World! echo %var% pause>nul |
sublime中:
2、读入的方法设置变量
set /p var=请输入一个变量: echo %var% pause >nul |
sublime中:
提到变量就不能不提批处理中的两个符号:% 和 !
批处理中,对变量不用像C语言一样预先定义就可以使用,非常自由
看似自由的机制,却又让人又痛苦:在没有预先说明哪些符号是变量
的情况下,计算机的识别问题。
解决方案:在编程时,对要使用的变量用 % 标明,在延迟变量的情况下
用 ! 标明
如:常规情况下
off set num=12 echo %num% pause |
如:延迟变量情况下
off setlocal enabledelayedexpansion set num=12 for /l %%i in (1,1,5) do ( set /a num+=10 echo !num! ) pause |
这两个例子就是关于常规情况下变量符号 % 和 延迟变量情况下变量符号 !
的使用,其功能在于告诉计算机该串代码是变量
而 %0 - %9 和 %* 这十一个符号中的 % 不是代表变量,而是参数的意思,
参数和普通变量不同,不能改变参数的值
在 for 里的 %%i,两个 % 标出的不是普通变量,而是循环变量,
循环变量和普通变量不同,不能改变循环变量的值
for 里的循环变量 %%i 和 参数 %0 - %9,其整体代表变量,引用时
不能再对其增加变量符号 % 或 !
在计算中,% 表示取余,如:
off set num=100 set /a result=num%%7 echo %result% pause |
在输出格式中,% 表示输出格式的意思 %str:~m,n%,详见 set 命令
总结:% 应用范围:变量、参数、循环变量、余数计算、格式
系统参数
%0,%1,%2,%3,%4,%5,%6,%7,%8,%9,%*
对于 %1 - %9
%1 批处理的第一个参数
%2 批处理的第二个参数
%3 批处理的第三个参数
%4 批处理的第四个参数
%5 批处理的第五个参数
%6 批处理的第六个参数
%7 批处理的第七个参数
%8 批处理的第八个参数
%9 批处理的第九个参数
批处理有且仅有这九个参数,不存在 %10 及以上参数
因为 call 命令允许使用参数,先看参数在 call 中的应用:
off call :loop Hello World! pause>nul & goto :eof :loop echo %1 echo %2 |
sublime中:
运行一览:
计算机认为 Hello World! 是两个参数,如果想让其是一个参数,
应该用双引号(英文格式)引起来
再如:用 call 带参数递归算阶乘
off title 阶乘--递归算法 echo. & echo. & echo 阶乘--递归算法 setlocal enabledelayedexpansion echo. & echo. set /p n=请输入一个数 : set result=1 if !n!==0 (echo 结果等于 1 & pause>nul & goto eof) else (call :loop !n!) echo. & echo 结果等于!result! pause>nul :loop if not %1==1 ( set /a result=!result!*%1 set /a x=%1 set /a x-=1 call :loop !x! ) |
sublime中:
运行一览:
参数也不止用在 call上,其他例子:
同一个目录下,有两个bat文件:
123.bat:
off start abc.bat 1,2,3,4 call abc.bat a b c d pause |
abc.bat:
off echo %1 echo %2 echo %3 echo %4 pasue>nul |
运行 abc.bat 一览:
运行 123.bat 一览:弹出两个窗口
可见:赋予参数时,参数和参数之间用逗号 或 空格隔开都可以
如:F盘根目录下有一个 test.bat
off format %1 |
在cmd窗口中执行:
在执行 test.bat 时,%1 就表示 z:,这样 format %1 就相当于
format z:,即格式化 Z盘
但此程序明显用 set 读入更简单:
off set /p a=请输入一个驱动器号: format %a% pause>nul |
运行一览:
双击执行 test.bat,输入 z:,若存在 Z盘,就会格式化 Z盘
(显然 这里 set 比 %1 - %9 简单)
再如:F盘根目录下有 test.bat,a.txt,b.txt:
off type %1 type %2 |
在cmd窗口中执行:将顺序显示 a.txt,b.txt 中的内容
很明显:同样可以不用 %1 - %9 就能实现显示文本文件
再看:删除文件和文件夹
del /f /q %1 rd /q /s %1 |
在cmd中执行时,像上面一样直接赋予要删除的文件(夹)的名字当
参数即可,实际上可以更简单,直接拖放某文件(夹)到这个 bat 文
件上面,即可彻底删除
之所以用了两个命令 del 和 rd ,是为了保证可以删除文件以及文件夹,
加上参数,是为了删除前不必经过确认就删除
%* 的作用不是很大,只是返回参数,不过它是一次返回全部参数的值,
不用输入 %0 - %9 来一个个确定
如:
off echo %* |
在cmd窗口中执行:空格也一起输出了
参数最多只能有九个,测试程序如下:
off echo %1 echo %10 echo %11 pause>nul |
sublime中:
在cmd窗口中执行:
咋一看,参数在10及以上似乎可以,其实不然,变换测试:
显然,%10 及以上是无效参数,但如果不指定返回参数,用 %*
输出全部参数,参数个数就没有限制了
%0 不是返回参数,其有两层意思:
第一层:如果 %0 前有 echo 等命令,则代表返回该批处理所在的绝对路径
第二层:如果 %0 前没有任何参数,则代表自身批处理,会无限循环执行
bat(也就是调用自身 bat 程序)
如:
off echo %0 pause |
运行一览:
此显示结果带双引号,如果不想要双引号,这么写:
off %%~i pause |
运行一览:
再如:无限循环执行 net user,即不断显示用户账户信息,
直到你手动停止为止(Ctrl+C)
off net user %0 |
运行一览:
再如:将自身复制到 D盘,并命名为 testx.bat
off echo Hello World! copy %0 d: estx.txt |
运行一览:
%0 高级用法:
1、最简单的死循环程序,同时也是最简单的批处理程序:
%0 |
运行一览:不断重复显示自身路径,直到手动停止(Ctrl+C)
2、用 %0 实现嵌套和递归
不仅是 call 调用函数的时候可以使用参数,%0 同样可以
如:
off set /a var=%1+1 echo %var% if %var% lss 100 (%0 %var%) else pause |
sublime中:
运行一览:从 1 显示到 100
如果用 call,就变成:
off :loop set /a var=%1+1 echo %var% %var% pause |
sublime中:
效果一样
出处:https://www.cnblogs.com/siwuxie095/p/6358173.html