Fork me on GitHub

批处理中的变量和参数(二)

-----siwuxie095

   

   

   

二、自定义变量

   

一般用 set 读入的方法定义和赋值

   

1、程序里设置变量

set var=Hello World!

echo %var%

pause>nul

   

sublime中:

   

   

   

2、读入的方法设置变量

set /p var=请输入一个变量:

echo %var%

pause >nul

   

sublime中:

   

   

   

   

   

   

提到变量就不能不提批处理中的两个符号:% !

   

批处理中,对变量不用像C语言一样预先定义就可以使用,非常自由

看似自由的机制,却又让人又痛苦:在没有预先说明哪些符号是变量

的情况下,计算机的识别问题。

   

解决方案:在编程时,对要使用的变量用 % 标明,在延迟变量的情况下

! 标明

   

如:常规情况下

@echo off

set num=12

echo %num%

pause

   

如:延迟变量情况下

@echo 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,其整体代表变量,引用时

不能再对其增加变量符号 % !

   

   

在计算中,% 表示取余,如:

@echo 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 中的应用:

@echo off

call :loop Hello World!

pause>nul & goto :eof

:loop

echo %1

echo %2

 

sublime中:

   

   

运行一览:

   

   

   

计算机认为 Hello World! 是两个参数,如果想让其是一个参数,

应该用双引号(英文格式)引起来

   

   

再如:用 call 带参数递归算阶乘

@echo 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:

@echo off

start abc.bat 1,2,3,4

call abc.bat a b c d

pause

   

abc.bat:

@echo off

echo %1

echo %2

echo %3

echo %4

pasue>nul

   

   

运行 abc.bat 一览:

   

   

   

运行 123.bat 一览:弹出两个窗口

   

   

   

   

可见:赋予参数时,参数和参数之间用逗号 空格隔开都可以

   

   

   

如:F盘根目录下有一个 test.bat

@echo off

format %1

   

   

在cmd窗口中执行:

   

   

   

在执行 test.bat 时,%1 就表示 z:,这样 format %1 就相当于

format z:,即格式化 Z盘

   

但此程序明显用 set 读入更简单:

@echo off

set /p a=请输入一个驱动器号:

format %a%

pause>nul

   

运行一览:

   

   

   

双击执行 test.bat,输入 z:,若存在 Z盘,就会格式化 Z盘

(显然 这里 set 比 %1 - %9 简单)

   

   

   

   

再如:F盘根目录下有 test.bat,a.txt,b.txt:

@echo 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 来一个个确定

   

如:

@echo off

echo %*

   

在cmd窗口中执行:空格也一起输出了

   

   

   

   

   

参数最多只能有九个,测试程序如下:

@echo off

echo %1

echo %10

echo %11

pause>nul

   

sublime中:

   

   

在cmd窗口中执行:

   

   

   

咋一看,参数在10及以上似乎可以,其实不然,变换测试:

   

   

显然,%10 及以上是无效参数,但如果不指定返回参数,用 %*

输出全部参数,参数个数就没有限制了

   

   

   

%0 不是返回参数,其有两层意思:

第一层:如果 %0 前有 echo 等命令,则代表返回该批处理所在的绝对路径

第二层:如果 %0 前没有任何参数,则代表自身批处理,会无限循环执行

bat(也就是调用自身 bat 程序)

   

如:

@echo off

echo %0

pause

   

运行一览:

   

   

   

此显示结果带双引号,如果不想要双引号,这么写:

@echo off

for %%i in (%0) do echo %%~i

pause

   

运行一览:

   

   

   

再如:无限循环执行 net user,即不断显示用户账户信息,

直到你手动停止为止(Ctrl+C)

@echo off

net user

%0

   

运行一览:

   

   

   

再如:将自身复制到 D盘,并命名为 testx.bat

@echo off

echo Hello World!

copy %0 d:\testx.txt

   

运行一览:

   

   

   

   

   

   

   

%0 高级用法:

   

1、最简单的死循环程序,同时也是最简单的批处理程序:

%0

   

运行一览:不断重复显示自身路径,直到手动停止(Ctrl+C)

   

   

   

2、用 %0 实现嵌套和递归

   

不仅是 call 调用函数的时候可以使用参数,%0 同样可以

如:

@echo off

set /a var=%1+1

echo %var%

if %var% lss 100 (%0 %var%) else pause

   

sublime中:

   

   

运行一览:从 1 显示到 100

   

   

   

   

如果用 call,就变成:

@echo off

:loop

set /a var=%1+1

echo %var%

if %var% lss 100 call :loop %var%

pause

   

sublime中:

   

   

   

效果一样

   

   

【made by siwuxie095】

posted on 2017-01-30 16:57  siwuxie095  阅读(38028)  评论(0编辑  收藏  举报

导航