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

来源:互联网 发布:java adobe 生成pdf 编辑:程序博客网 时间:2024/06/04 23:18

-----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.bat1,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)doecho%%~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% lss100 (%0 %var%)else pause

  

sublime中:

  

  

运行一览:从 1显示到 100

  

  

  

  

如果用 call,就变成:

@echo off

:loop

set /a var=%1+1

echo%var%

if%var% lss100call :loop%var%

pause

  

sublime中:

  

  

  

效果一样

  

  

【made by siwuxie095】

0 0
原创粉丝点击