文档库 最新最全的文档下载
当前位置:文档库 › 批处理进阶之变量和参数

批处理进阶之变量和参数

批处理进阶之变量和参数
批处理进阶之变量和参数

目录

批处理进阶之变量和参数

第一节基本概念

1、数据类型

2、常量和变量

3、参数和参数变量

第二节变量的分类

1、环境变量

2、参数变量

3、迭代变量

第三节SET命令详细用法

1、显示、设置或删除环境变量

2、/P 交互模式开关与菜单设计

3、/A 数学开关与简单数学计算

第四节增强的变量引用

1、增强的环境变量引用

2、增强的参数变量/循环变量引用

第五节参数传递和漂移

1、参数传递

2、参数漂移

第六节变量的局部化

1、SETLOCAL和ENDLOCAL

2、环境变量延迟扩展

======================================================================

第一节基本概念

本节内容推荐有一定的批处理基础或者编程基础的人看。

1 数据类型

任何程序都是由指令和数据组成的,类推到批处理上面就是命令和数据了。

数据有类型之分,不同类型的数据在计算机内部的存储方式,取值范围和支持的运算都是不同的。

从目前来看,批处理涉及的数据类型有两种:字符串类型、数字类型。

字符串类型:任意数量的字符,可以用双引号来界定一个字符串,这在很多语言里面是通用的。

例子:s、doom "12.3+78" "TRUE LOVE"。

字符串类型可以进行字符运算,例如替换、合并等。

数字类型:批处理支持数字类型为整数。

例如60、312 等。

数字类型可以进行数学计算,而数字形式的字符串是不能直接进行数学计算的。

批处理是一种“弱类型”的脚本语言。它的数据类型极少,而且对数据类型的界定也很模糊。目前批处理已经实现数据类型的自动化处理,即在需要时可以自动转化数据类型,而这个转换过程用户是感觉不到的。用户完全不必理会数据的类型或者数据类型是否需要转化,或者我们可以简单理解为批处理只有一种数据类型——字符串类型。其实这是脚本类语言的共同特点,“弱类型”大大简化了脚本代码。

2 常量和变量

借用其他高级编程语言的概念,来分析一下批处理里面的常量和变量……

根据运行时存储位置所存储的值能否被改变,我们可以把数据可以分为常量(数据)和变量(数据)。

常量是系统内置的或用户预定义的,在执行过程中其值是明确而唯一的,不能被改变。例如,"hello"等字符(串)都是系统内置常量,可以直接使用,不一定需要标识符。批处理里面的常量概念很弱,也没有相关的操作命令支持自定义常量,因此可以不理会常量。

变量也是由系统或者用户预定义的,但其存储的内容在运行期间可以发生改变。批处理里面的变量都必须有标识符,即变量名,每一个变量名都指向一个具体的存储空间。变量名或由系统预定义,或由用户自定义。批处理中,变量的设置(定义,初始化,赋值)一般是通过SET语句来完成的。由于批处理是“弱类型”脚本语言,定义变量时不必理会变量的类型,命令解释器会自动决定使用哪种类型或者在使用时自动完成类型转换。

在批处理中使用变量,有两重好处:

(1)用简单的名称替代复杂的字符,简化代码。

(2)使用统一的代码段,通过改变变量值来实现重用。

3 参数和参数变量

[/D] 是功能开关,此开关表示是否开启跨驱动器切换工作目录。

[drive:][path] 就是参数了,也就是待接受处理的对象,其默认值当前工作目录。

从上面的简单分析我们知道,参数是用来指定命令要处理的对象。任何命令行运行时都需要参数,所谓“不需要参数就能运行”的命令(批处理)其实都包含了默认的参数,逻辑上依然存在实实在在的参数。例如运行"dir"时,其隐藏的参数就是当前工作目录。

除了在运行命令时可以使用参数,我们在调用批处理或子程序时也可以使用参数。实际上,我们可以把被调用的批处理或者子程序看成是特殊的命令。

上面讲过,运行命令时参数是用来告诉命令要处理的对象,即传递给命令的信息。

调用批处理(子过程)时参数是传递给被调用者的信息,而参数变量就是是被调用者用来接收传入信息的变量。

我们要区分参数和参数变量这两个概念也很简单:

参数是相对于调用者来说的,参数变量是相对于被调用者来说的。

参数只有在调用过程中才有存在,而参数变量一直存在无论是否被调用。

======================================================================

第二节变量的分类

批处理中的变量,按照产生来源和用途分为:"环境变量" 、"参数变量"和"循环变量"。

1、环境变量

微软描述:环境变量是包含诸如驱动器、路径或文件名之类的字符串。它们控制着多种程序的行为。例如,TEMP 环境变量指定程序放置临时文件的位置。请记住:环境变量本质上是字符串类型变量,其存储(或被引用)的内容一定是字符串!

环境变量可以分为预定义环境变量和自定义环境变量。

(1)预定义环境变量

他们由windows系统自动定义和赋值,他们的值保存在注册表中,用户一般直接引用即可,当然在需要时也可以改变他们的值。任何用户都可以添加、修改或删除“用户环境变量”,但是只有管理员才能添加、修改或删除“系统环境变量”。

我把他们列出来。

%ALLUSERSPROFILE% 本地返回“所有用户”配置文件的位置。

%APPDATA% 本地返回默认情况下应用程序存储数据的位置。

%CD% 本地返回当前目录字符串。

%CMDCMDLINE% 本地返回用来启动当前的Cmd.exe 的准确命令行。

%CMDEXTVERSION% 系统返回当前的“命令处理程序扩展”的版本号。

%COMPUTERNAME% 系统返回计算机的名称。

%HOMEDRIVE% 系统返回连接到用户主目录的本地工作站驱动器号,基于主目录值设置。用户主目录是在“本地用户和组”中指定的。%HOMEPATH% 系统返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

%HOMESHARE% 系统返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。

%LOGONSERVER% 本地返回验证当前登录会话的域控制器的名称。

%NUMBER_OF_PROCESSORS% 系统指定安装在计算机上的处理器的数目。

%OS% 系统返回操作系统名称。Windows 2000 显示其操作系统为Windows_NT。

%PATH% 系统指定可执行文件的搜索路径。

%PATHEXT% 系统返回操作系统认为可执行的文件扩展名的列表。

%PROCESSOR_ARCHITECTURE% 系统返回处理器的芯片体系结构。值:x86 或IA64 基于Itanium

%PROCESSOR_IDENTFIER% 系统返回处理器说明。

%PROCESSOR_LEVEL% 系统返回计算机上安装的处理器的型号。

%PROCESSOR_REVISION% 系统返回处理器的版本号。

%PROMPT% 本地返回当前解释程序的命令提示符设置。由Cmd.exe 生成。

%RANDOM% 系统返回0 到32767 之间的任意十进制数字。由Cmd.exe 生成。

%SYSTEMDRIVE% 系统返回包含Windows server operating system 根目录(即系统根目录)的驱动器。

%SYSTEMROOT% 系统返回Windows server operating system 根目录的位置。

%TEMP% 和%TMP% 系统和用户返回对当前登录用户可用的应用程序所使用的默认临时目录。

%TIME% 系统返回当前时间。使用与time /t 命令相同的格式。由Cmd.exe 生成。有关time 命令的详细信息,请参阅Time。

%USERDOMAIN% 本地返回包含用户帐户的域的名称。

%USERNAME% 本地返回当前登录的用户的名称。

%USERPROFILE% 本地返回当前用户的配置文件的位置。

%WINDIR% 系统返回操作系统目录的位置。

要查看一个环境变量的值,可以这样使用:

echo %WINDIR%

应用实例:复制文件到当前帐号的启动目录里

copy d:\1.cmd "%USERPROFILE%\「开始」菜单\程序\启动\"

(2)自定义环境变量

顾名思义,自定义环境变量是由用户定义的环境变量。

要使用自定义环境变量请使用SET命令。

例子:

@echo off

SET str=批处理教程

echo %str%

pause

请注意,通过SET设置的环境变量如果不赋值,其初始值为“空字符串”。

怎么引用环境变量?(翻译自微软)

要在命令行或脚本中引用变量环境的值,请将变量名包括在百分号之中(即%abc%形式)。如果你不使用百分号,命令解释器会把它当成普通字符串来处理。为变量定义值(即赋值)之后,请将变量名包括在百分号之中引用。

Cmd.exe就用变量的真实值替换%USERNAME%,这样就消除了为每个用户手动执行此任务的必要。

有关变量引用的更详细信息,请参阅FOR /?或Call /?。

2、参数变量

什么是参数变量?我们先来看看一个批处理调用过程,A调用B,A是调用者,B是被调用者。如果A要想传递参数,那么B必须要能接收参数。为了能够让B接受外部的参数,批处理引入了一类新的变量(%1 %2 %3 ......一直到%9,%0),这类变量只用于接受外界传入的参数,他们就是参数变量。另外,在标签段(即子过程)内也可以使用参数变量,用于批处理内部call调用时的参数传递。综合这两种情况,参数变量总是出现在批处理中。

一句话:参数变量是在批处理(或子程序)中用来接收参数的变量。

参数变量的特点

(1)系统预定义,可以直接使用;

(2)不能在批处理内部对其直接赋值,只能从外部传入;

参数变量虽然不能直接赋值,但是可以通过环境变量中转实现类似的效果:

错误的用法

@echo off

SET /A %1=%1+1

echo %1

pause

正确的用法

@echo off

SET /A a=%1,a=a+1

echo %a%

pause

下面开始具体的讲解。

★(1)%1 用于接收传入的第一个参数;%2 用于接收传入的第二个参数;%3-%9依此类推。

传入参数时,以空格分隔参数,按顺序依次传递给%1、%2。

如果没有传入参数或者传入的参数数目不够,那么参数变量的值就是空字符串。

%* 指向批处理中的所有参数变量(%1…%9),一旦参数传递完成,%*的值也就自动确定了。

我们看这个例子,保存下列代码为test.cmd:

@echo off

echo

echo %1 %2 %3 %2 %4

echo %*

pause

(说明:%1=how %2=do %3=you %4=?)

运行:test.cmd how do you ? 后的结果:

how do you do ?

how do you ?

我们看到:%*一次返回了所有参数变量的值,并且各参数之间自动用空格分隔。(想想,传入的参数个数可以超过参数变量的个数吗?请参阅“参数漂移”)

★(2)%0 指向批处理文件自身,返回批处理路径。

%0变量的值是由系统自动传递的,不能被用户赋值!

例子循环执行批处理

@echo off

net user

%0

保存为netuser.cmd后执行,他就会无限循环执行net user这条命令。

提示:请通过CTRL+C来关闭此批处理,或者直接关闭运行窗口!

更多信息,请参考“CALL命令“增强的变量引用”。

3、循环变量

循环变量就是在FOR循环执行过程用来保存文件路径等字符串的变量。

循环体每执行一次,该变量的值就被替换一次,这就是迭代的含义。

循环变量也称为迭代变量、FOR变量。

先看一下FOR命令的最基本形式:

命令行形式FOR %i IN (SET) DO command [command-parameters]

批处理形式FOR %%i IN (SET) DO command [command-parameters]

上面的%i 和%%i即循环变量,i为单一字母(要区分大小写)。

循环变量包含:

%a~%z,%A~%Z :命令行形式

%%a~%%z,%%A~%%Z :批处理形式

我们先说一下循环变量的主要特点

(1)循环变量也是由cmd解释器预定义,用户可以直接引用。

(2)循环变量只能由循环过程自动赋值(即迭代),用户不能主动更改。

(3)循环变量的增强引用和其他命令(如CALL)是一致的。

======================================================================

第三节SET命令详细用法

在前面的环境变量部分,我们已经知道了SET的基本用法。

现在我们来系统地讲解一下SET命令的所有用法!

基本格式:SET [variablename=[string]]

variablename 环境变量名

string 指派给变量的字符串(或字符串表达式)。

扩展模式(默认是开启的)下添加了两个新命令行开关:

SET /A expression

SET /P variable=[promptString]

注意:

●变量名不要和关键字(如命令名)相同,最好不要使纯数字作为变量名。

●变量名不区分大小写,但是set命令显示的变量名与您键入的完全相同。

●在变量名中结合使用大写字母和小写字母,可以使代码更具有可读性(例UserName)。

●SET 命令不允许变量名含有等号(但可以含有其他特殊符号,如?)。

●SET 命令只能更改当前解释器(CMD.exe)的环境变量。

1、显示、设置或删除环境变量

(1)要显示当前所有环境变量,请键入不带参数的SET。

要显示某个环境变量,键入:“SET name” 。

例如:“set windir”(注意没有变量引导符!)

如果命令拓展被启用(默认是启用的):

可仅用一个字符串激活SET 命令,显示所有前缀匹配该字符串的变量的值。

例如:

SET P 会显示所有以字母P开头的变量

SET all 会显示以所以all开头的变量

如果在当前环境中找不到该变量名称,SET 命令将把ERRORLEVEL设置成1。

(2)要添加变量,请在命令提示符下键入:

SET variablename=value

要更改变量,请在命令提示符下键入:

SET variablename=value

如果写成SET variable="",此时变量值并不为空,而是等于两个引号,即""。

等号后面的任何内容都会被视为值。

如果使用引号,则必须将引号作为值的组成部分。

可以将大多数字符用作变量值,其中包括空格。

如果使用特殊字符<、>、|、& 或^,则必须在它们前面加上转义字符(^)或引号。

请考虑下列范例:

要创建变量值new&name,请键入:SET var=new^&name

要创建变量值"new&name",请键入:SET var="new&name"

如果在命令提示符下键入SET var=new&name ,此命令会被”&”截断为”SET var=new”和“name”。

注意

最大单个环境变量大小为8192 字节。

所有变量的最大环境变量的总和大小(包括变量名和等号)为65,536 KB。

2、/P 交互模式开关与菜单设计

语法SET /P variable=[promptString]

/P开关允许将变量的值设成用户输入的一行输入。

读取输入行之前,显示指定的promptString,promptString 可以是空的。

例子

@echo off

SET /p var=请输入变量的值:

echo 您输入了%var% ~_~

pause

var是变量名,=号右边的是提示语,不能当成变量值。

/P 开关一般用于设计交互式菜单,来看一个本人的例子。

:MENU

cls

echo.

echo 说明:精简后的体积数据来源于4.6,其初始体积接近160M。

echo.

echo 1 保留托盘、主界面、扫描漏洞和设置程序(精简后体积36.9 M)

echo 2 仅保留托盘、主界面(精简后体积32.1M) ★推荐★

echo 3 仅保留托盘(精简后体积24.0M)

echo 0 要退出请直接关闭窗口!

echo.

if "%n%"=="3" GOTO c3

if "%n%"=="0" exit

GOTO MENU

3、/A 数学开关与简单数学计算

(1)语法:SET /A expression

expression 数学表达式,可以使用双引号将数学表达式括起来。

/A 命令行开关指定等号右边的字符串为被识别为数学表达式。

Cmd.exe的数学表达式跟C语言里面的表达式基本上完全一致。

SET支持的运算符也跟C语言里面的一样,只是没有了自加一自减一。

该表达式支持以下数学运算符号(以递减的优先级顺序排列):

() -()里面的表达式具有最高优先级,并且可以嵌套

! ~ - -一元运算符(逻辑“非”,按位“取反”,正负反转)

* / % -算术运算符

+ - -算术运算符

<< >> -二进制逻辑移位

& -二进制按位“与”

^ -二进制按位“异或”

| -二进制按位“或”

= *= /= %= += -= -算术运算赋值

&= ^= |= <<= >>= -二进制运算赋值

, -数学表达式分隔符

要理解/A的作用,请看以下例子:

SET /A 3*2 判断字符串,如果是有效的数学表达式,就计算其结果。

SET /A aba 判断字符串,如果是无效的数学表达式,尝试定义一个数字变量,其初始值为0。

SET /A ada=3*2 这个很好懂了,把右边数学表达式的计算结果赋值给左边的数字变量。

SET /A d=ada-1 等号右边允许直接引用变量(没有%%),这是SET /A 的特殊之处,下面会讲到!

如果SET /A 在命令窗口中执行,那么运行后它会显示该表达式的运算结果,参见下面例子。

SET /A n=5,运行后会显示5

SET /A 3+5*7 运行后显示38。

(2)数字类型和字符串类型

我们知道cmd.exe支持两种类型的数据:字符串类型和数字类型。我们把用来存放字符串类型数据的变量称为字符串变量,用来存放数字类型数据的变量称为数字变量。前面提到过,所有的环境变量、参数变量和循环变量都是字符串变量。

而使用SET /A定义的变量是数字类型,体现在以下两点:

我们知道,C语言是一种“强类型”的语言,变量的定义时要制定类型、赋值时又必须严格的类型匹配。

Cmd.exe有一个变量类型自动匹配的机制,也就是说他会根据需要来决定什么时候使用什么类型并自动完成变量类型的转换。而这个转换过程,用户是感觉不到的,这造成了大多数人认为的“cmd.exe只有一种字符串类型”的假象。

我们通过下面的例子来加深对字符串类型和数字类型的理解。

SET aa=10 此时aa被定义为字符串类型

SET aa=%aa%+1 结果显示的10+1,而不是11。

SET /A aa=10 把aa指定定义为了数字类型

SET /A aa=aa+1 直接引用(无%%),结果是11

接着上面的例子,体会一下变量类型的自动转换。

SET aa=10

SET /A bb=%aa%+1

SET /A cc=10

SET dd=%cc% days!

在第二行中,%aa%引用的是字符串变量,出现在数学表达式中,被自动转换为数字类型,因此最后bb的值是11 。在第四行中,由于没有了/a,是不能直接用cc形式来引用的,如果直接引用,dd的值就是字符串cc了。而DD被定义为一个字符串变量,其等号后面的内容被认为是一个字符串表达式,%CC%会被自动转换成字符串类型。

通过上面的分析,我们知道了cmd.exe会自动转换变量类型,平时我们是不需要担心变量类型的相关问题的。由于字符串变量和数字变量可以“互通”,因此我们有时把数字变量看做是一种特殊的“字符串变量”或“环境变量”。

(3)数学计算

批处理里面的数值计算功能较弱,只能够进行整数运算,忽略小数部分。

同时数值计算的范围也受限于系统位数,一般为0x80000000h~0x7FFFFFFFh,即-2147483648~+2147483647。

除了十进制,cmd.exe还支持八进制(前缀0)、十进制(无前缀)和十六进制(前缀0x)形式的数字。

请注意八进制数字可能很容易搞混:08 和09 是无效的数字,因为八进制数只有0-7八个数字。

Cmd.exe支持不同进制之间的混合计算。

例如SET /A a=123+0123+0x123,计算结果将自动转换到十进制。

运算实例:(由龙卷风设计)

@echo off

SET /p input=请输入数学表达式:

SET /A var=%input%

echo 计算结果:%input%=%var%

pause>nul

请输入数学表达式:1+9+20+30-10

计算结果:1+9+20+30-10=50

请输入数学表达式:-100+62 #负数

计算结果:-100+62=-38

请输入数学表达式:(25+75)*2/(15+5) #括号

计算结果:(25+75)*2/(15+5)=10

请输入数学表达式:1234567890*9876543210 #超出范围,无效数字

计算结果:1234567890*9876543210=

数学表达式分隔符“逗号”的作用:

运行SET /A a=1+1,b=2+1,c=3+1后,用echo %a% %b% %c%后看结果,会发现赋值都成功了。

上面的例子等同于SET /A a=1+1 & SET /A b=2+1 & SET /A c=3+1。

有时候我们需要直接在原数字变量上进行操作这样用:

SET /A var+=1 对应的是set /a var=var+1

SET /A var*=2,对用的是set /a var=var*2

这样的自操作算术运算符有五个:*=、/= 、%= 、+=、-=

由于位运算符(<< >> & | ^)都是特殊符号,按照上面直接使用会出错。

例如“SET /A var=1 & 1”与运算,并不会显示为1,因为cmd.exe会把&解释成命令分隔符。

对于这样的"位运算符",我们需要把他们用双引号引起来,也可以用转义字符^,看例子。

SET /A var= 1 "&" 1 与运算(同为1时为真,一方出现假即为假)

SET /A var= 1 ^| 1 或运算(同为假时才为假,只要一方出现真即为真)

SET /A var= 1 "^" 1 异或运算(相同为假,相异为真)

SET /A var= 3 "<<" 2 左移位运算,3的二进制为11,左移2位为1100,换成十进制就是12

SET /A var= 4 "^>^>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1

很明显,如果是移位操作符^,需要使用两次^,此时使用双引号显得更方便。

另外可以使用双引号将整个数学表达式括起来,也能起到同样的作用,此时数学表达式看起来更直观。例如set /a “a=16<<2"

对于取余运算符(%),在控制台中是可以直接使用,但是在批处理中直接使用则会出错。

%在批处理里面是参数变量引导符,批处理总是把它和后面的数字解释成一个参数变量。

例如:”set /a a=100%7” ”set /a a=”100%7” ”set /a “a=100%7” 都不会得到正常结果。

要想在批处理中使用取余操作符,必须使用%%,使用双引号和或者^也都是无效的。

个人补充:(一般人看了也没什么用)

这里的位运算都是二进制位,每一位的值为0或1。

可以输入十进制、8进制、16进制的数字,遇到位操作时cmd.exe会自动把他们转换成二进制形式。与运算:只有两个同时为真,结果才为真;只要出现一个假,结果全部为假。

或运算:子要出现一个真,结果就为真:只有同时出现两个假,结果才为假。

异或运算:只要相异就为真,相同则为假。

SET /A num=1^<^

echo %num%

pause>nul

======================================================================

第四节增强的变量引用

我们先回顾一下普通的变量引用形式。环境变量为%var%或!VAR!,参数变量为%0-9,循环变量为%a-z %%a-z。

那么什么是增强的变量引用?就是在引用的同时对字符串进行编辑或者扩充。

1、增强的环境变量引用

CMD(或批处理)有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集。

CMD(或批处理)中可实现的字符串处理功能有:截取字符串内容、替换字符串内容、合并字符串。

增强的环境变量引用,是一种高级的环境变量引用方式,在引用的同时对字符串进行处理(替换、截取、合并)。(1)、字符串替换将环境变量中的特定字符(串)替换为另一字符(串)。

格式:%varname:str1=str2%

说明:用"str2" 替换每一个"str1"。

要删除所有的"str1","str2" 为空即可。

"str1" 可以以星号(*)打头;这样从开始到一直到匹配的内容都会被str替换。

"str1"不支持中间或者后面的*,?通配符则完全不被支持。

字符串替换实例1:

@echo off

SET a=hello world!

echo 替换前的值: %a%

echo 替换后的值:%a: =%

echo 替换后的值:%a:llo= is her %

echo 替换后的值:%a: =_%

echo 替换后的值:%a:*lo=the%

pause

运行结果:

替换前的值: "hello world!"

替换后的值: "helloworld!"

替换后的值: "he is her world!"

替换后的值: "he_is_her_world!"

字符串替换实例2:

echo 替换后:%aa:中国=中华人民共和国%

pause

(2)、字符串截取截取环境变量的特定位置的字符(串)。

格式:%varname:~[m[,n]]%

说明:m为偏移量(缺省为0),n为截取长度(缺省为全部)。

范例1:

%windir:~1,5% 偏移位置为1,偏移量为5,会截取第2、3、4、5、6共5个连续的字符。

%windir:~1,-1% 截取内容为第二个至倒数第二个,等于去掉了首尾字符。

%windir:~-5% 取倒数5个字符。

%windir:~0,-2% 截取第1个至倒数第3个字符。

上面所述用法其实相当于vbs函数mid、left、right

%a:~0,n% 相当于函数left(a,n) 取左边n位

%a:~-m% 相当于函数right(a,m)取右边m位

%a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位

%a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位

%a:~m % 相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。

范例2:

@echo off

echo 当前时间是:%time% 即%time:~0,2%点%time:~3,2%分%time:~6,2%秒%time:~9,2%厘秒pause

思考题目:输入任意字符串,求字符串的长度

@echo off

SET /p str=请输入任意长度的字符串:

echo 你输入了字符串:"%str%"

call :stringlenth "%str%" num

echo 字符串长度为:%num%

pause

exit

:StringLenth

::---------字符串长度计算子过程

::---------参数%1为字符串(如有空格,请用引号括起来)

::---------参数%2为返回变量名称,不能含空格或特殊字符

::@echo off

SET theString=%~1

IF not defined theString goto :eof

SET Return=0

:StringLenth_continue

SET /A Return+=1

SET thestring=%thestring:~0,-1%

(3)、字符串合并

合并字符串,将两个字符串放在一起就即可。

=========================================

@echo off

SET aa=伟大的中国!

SET bb=我为你自豪!

SET "aa=%aa%%bb%"

echo aa=%aa%

pause

=========================================

字符串替换和截取使用时是有限制的,即变量引用形式为%var%或者!var!,也就是说只能使用在环境变量身上。而对于形式为%0-%9,%i,%%i形式的参数变量和循环变量怎么进行增强呢?老办法是:通过环境变量来中转。

例子:Set a=%1&Echo %a:-1%

2、增强的参数变量/循环变量引用

我们知道,参数变量和循环变量都是字符串类型的,他们支持另外一种类型的增强引用!

如果这个变量的值指向的是一个文件名或者路径名,可以通过~作以下增强引用。

对于参数变量:

~1 - 删除任何引号("),扩展%1

%~f1 - 将%1 扩展到一个完全合格的路径名

%~d1 - 仅将%1 扩展到一个驱动器号

%~p1 - 仅将%1 扩展到一个路径

%~n1 - 仅将%1 扩展到一个文件名

%~x1 - 仅将%1 扩展到一个文件扩展名

%~s1 - 扩展的路径只含有短名

%~a1 - 将%1 扩展到文件的文件属性

%~t1 - 将%1 扩展到文件的日期/时间

%~z1 - 将%1 扩展到文件的大小

%~$PATH:1 - 查找列在路径环境变量的目录,并将%1 扩展到找到的第一个完全匹配的名称。

如果环境变量名未被定义,或者没有找到文件,此关键词会扩展到空字符串。

对于循环变量

~i - 删除任何外围引号("),扩展%i

%~fi - 将%i 扩展到一个完全合格的路径名

%~di - 仅将%i 扩展到一个驱动器号

%~pi - 仅将%i 扩展到一个路径

%~ni - 仅将%i 扩展到一个文件名

%~xi - 仅将%i 扩展到一个文件扩展名

%~si - 扩展的路径只含有短名

%~ai - 将%i 扩展到文件的文件属性

如果环境变量名未被定义,或者没有找到文件,此关键词会扩展到空字符串。

可以组合修定符来取得多重结果:

%~dp1 - 将%1 扩展到驱动器号和路径

%~nxi - 将%i 扩展到文件名和扩展名

在上面的例子中,%1或%i 可以被其他有效数值替换。

%~ 语法被一个有效参数号码或者字母终止。

%~ 修定符不能跟%*使用

例子1:

@echo off

Echo 当前的批处理运行文件是%0

Echo 当前批处理的运行目录是%~dp0

Echo 当前批处理的文件属性、文件时间%~at0

Pause

例子2:

FOR /F "delims==" %%i IN (‘dir /b’) DO @echo %%~nxzi

环境变量的引用不支持这种形式的增强。

=======================================================================

第五节参数传递和参数漂移

来看个例子,顺便复习上一节的内容。

@echo off

Echo 产生一个临时文件> tmp.txt

Call :sub tmp.txt

pause

Del tmp.txt

exit

:sub

Echo 删除引号:%~1

Echo 扩展到路径:%~f1

Echo 扩展到一个驱动器号:%~d1

Echo 扩展到一个路径:%~p1

Echo 扩展到一个文件名:%~n1

Echo 扩展到一个文件扩展名:%~x1

Echo 扩展的路径指含有短名:%~s1

Echo 扩展到文件属性:%~a1

Echo 扩展到文件的日期/时间:%~t1

Echo 扩展到文件的大小:%~z1

Echo.

Goto :eof

1、参数传递

命令解释器是如何分割传递的参数的呢?

首先,将命令行中的有定义的环境变量全部展开(无定义的不变)。然后,处理由^定义的转义字符。最后,用双引号("")、逗号(,)、分号(;)和空格分割,并将分割后的第一个部分用作命令名,其他的作为参数,所有的参数中都包含各自的双引号,然而命令名中的双引号没有影响。逗号和分号以及空格则不包含在分割的各部分中。

直接运行命令、批处理内部call调用子过程、调用另一个批处理都可能涉及到参数传递的问题。

Call调用是最常用最复杂的一种调用方式,我们这里只分析call调用时的参数传递,其他调用方式类似。

批处理的call调用的参数传递分为直接和间接两种方式。

(1)、直接传递

直接传递参数,即在使用call命令时,不使用任何参数,在被调用批处理(或子过程)里面对调用者的变量进行修改。这跟汇编语言里面的参数传递方式类似。

===============================================

@echo off

SETLOCAL enabledelayedexpansion

SET var=aCdehiM,?mnrstW y

echo %var%

call :deal

SETLOCAL disabledelayedexpansion

SET var=%var:?=!%

echo %var%

pause>nul

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 :eof

===============================================

可以发现,当我们把变量var作为参数赋予子过程:deal后,子过程对var的值进行了修改;当子过程返回后,主函数里面的var的值就已经是子过程里面var被修改后的值了。该例子中,使用了后面讲到的SETLOCALenabledelayedexpansion和SETLOCALdisabledelayedexpansion,前者保证了var在FOR循环里面能够根据我们的意愿进行处理,后者保证了能够正确输出符号"!"。

直接调用这种方式不要求被调用者(批处理或子过程)内部使用参数变量。

传递是通过同名变量的方式进行的。

(2)、间接传递

间接传递参数,即在使用call命令时,在其后面添加参数。这跟C语言里面传递参数的格式类似。不同于C语言,批处理中的子过程不需要定义形参,更不需要指定参数的个数。传递过来的参数,在子过程或子批处理里面是以%1~%9的形式表示的。

===============================================

@echo off

call :deal aaa bbb "c c" ddd eee

pause>nul

exit

:deal

echo %%0 = %0

echo %%1 = %1

echo %%2 = %2

echo %%3 = %3

echo %%4 = %4

echo %%5 = %5

===============================================

参数列表中包含空格的依旧要用双引号(")引起来;另外,也可以看到,%0已经变成了子过程的标号,而不是被调用批处理的名称了。

间接调用这种方式要求被调用者(批处理或子过程)内部使用参数变量来接受传入的参数。

【区别】

这两种参数传递方法本质上是没有区别的,形式上,直接传递方式对原变量进行操作,丢失了原变量的值;间接传递则通过%n对原变量进行了简单的备份,并且通用性更强,即不限定原变量的名称。另外,使用%n还有一个非常大的好处,就是可以通过%~*n来扩展引用。

针对二者的差别,可以根据情况决定使用哪种传递方式:

--1、作为参数的变量名固定、且在子过程中不需要对其进行备份的情况下,使用直接传递法;

--2、若将子过程作为一个通用的程序模块,或者作为参数的变量不需要备份时,使用间接传递法。

具体使用哪种方法,还需根据实际情况或使用习惯进行选择。

(3)混合传递(纯属个人意淫)

没什么好解释的,即同时使用直接传递和间接传递两种方式,看例子……

@echo off

Set var=%time%

call :echostr "OK"

pause>nul

goto :eof

goto :eof

2、参数漂移

在上面我们看到,直接传递参数是没有个数限制的,调用者中的所有环境变量被调用者都能使用。间接传递参数时被调用者需要使用参数变量来接收参数。但是一个批处理中只能出现%1……%9九个参数变量,那么是不是意味着一次最多只能传递九个参数进去呢?

当然不是了,我们先来看一个例子,保存以下内容为test.cmd

范例1:

@echo off

echo %1 %2 %3 %4 %5 %6 %7 %8 %9

SHIFT

echo 第一次参数漂移结果:

echo %1 %2 %3 %4 %5 %6 %7 %8 %9

SHIFT

echo 第二次参数漂移结果:

echo %1 %2 %3 %4 %5 %6 %7 %8 %9

pause

运行“test.cmd 1 2 3 4 5 6 7 8 9 10 11 12 13”结果:

1 2 3 4 5 6 7 8 9

第一次参数漂移结果:

2 3 4 5 6 7 8 9 10

第二次参数漂移结果:

3 4 5 6 7 8 9 10 11

上面的的例子,我们一下子传入了13个参数,而且传入的参数都能使用!

虽然批处理中只能出现%1-%9九个参数变量,但是他们可以是可以重复使用的!

Shift就是这样的一个命令,他会向逻辑移位一样是参数变量的值发生“漂移”。

SHIFT的用法很简单:SHIFT [/n]

SHIFT 命令的工作原理(微软解释)

SHIFT 命令通过将每个参数复制到前一个参数变量中,更改批处理参数变量%0 到%9 的值。也就是说,将%1 的值复制到%0,%2 的值复制到%1,依次类推。该命令在撰写对任意数目的参数执行相同操作的批处理文件时非常有用。

将%* 与SHIFT 一起使用,SHIFT 对%* 没有作用。没有反向“漂移”的SHIFT 命令。

执行了SHIFT 命令后,不能恢复更改前存在的第一个批处理参数(%0)。

如果一次传递的参数少于9个时也是可以使用漂移命令的。

启用命令扩展(默认启用)后,SHIFT 命令支持/n 命令行选项,该选项通知命令在第n 个参数处开始更改,n 可以是0 到8 的任何一个值。例如:SHIFT /2可以将%3 改为%2,将%4 改为%3 等等,而%0 和%1 保持不

以下批处理文件Mycopy.bat 显示了如何使用包含任意数目批处理参数的SHIFT 命令。

该批处理文件将一列文件复制到特定的目录。批处理参数由目录和文件名参数表示。

@echo off

SET todir=%1

:getfile

SHIFT

IF "%1"=="" goto end

copy %1 %todir%

goto getfile

:end

SET todir=

echo All done

请注意,每漂移一次,就要丢失一个前面的参数变量的值!

如果你要保存该参数变量的值,请使用环境变量来保存。

环境变量不受SHIFT命令影响!

======================================================================

第六节变量的局部化

如果一个批处理比较复杂,其中的变量比较多,那么我们就需要考虑这些变量的作用范围了。SETLOCAL和ENDLOCAL 就是这样一对命令,可以把变量的作用范围限制在指定的代码段内,这个过程称为变量的局部化(或本地化)。开启局部化后的变量叫做局部变量或者局部环境变量。

1、SETLOCAL和ENDLOCAL

SETLOCAL开始批处理文件中变量的局部化,ENDLOCAL结束批处理中变量的局部化。在执行SETLOCAL 之后所做的环境变量的改动只限于批处理文件的指定代码段。SETLOCAL和ENDLOCAL一般需要成对使用,如果没有遇到配对的ENDLOCAL,SETLOCAL开启的局部化会一直延续到批处理的结束。遇到ENDLOCAL后,Cmd.exe 将退出局部化并销毁所有的局部环境变量。

语法

SETLOCAL {enableextensions | disableextensions} {enabledelayedexpansion | disabledelayedexpansion}

ENDLOCAL

参数

enableextensions 临时启用命令扩展,直到出现匹配的ENDLOCAL 命令结束,

disableextensions 临时禁用命令扩展,直到出现匹配的ENDLOCAL 命令结束,

enabledelayedexpansion 临时启用延迟的环境变量扩展,直到出现匹配的ENDLOCAL 命令结束disabledelayedexpansion 临时禁用延迟的环境变量扩展,直到出现匹配的ENDLOCAL 命令结束

注释:

(1)在批处理程序中可以包含多个SETLOCAL 或ENDLOCAL 命令(嵌套)。

(2)当您在批处理文件外使用SETLOCAL 或ENDLOCAL 时,将没有效果。

(3)在批处理文件的结尾处有一个隐含的ENDLOCAL 命令。

(4)运行SETLOCAL 后对环境变量所作的更改在只限于代码段。

范例1

@echo off

SET a=out

Set b=bad!

SETLOCAL

echo %a%

SET a=in

SET b=good!

echo %a% %b%

ENDLOCAL

echo %a% %b%

pause

运行结果:

in good!

Out bad!

通过上例我们看到:

SETLOCAL和ENDLOCAL之间的代码段内的局部变量是完全独立的,不会和其他部分的同名变量发生冲突。

如果遇到同名的变量,会优先使用局部变量,而且改变局部变量的值也不影响其他代码部分的同名变量。

如果SETLOCAL后面有一个参数,SETLOCAL将设置ERRORLEVEL 的值。遇到{enableextensions | disableextensions} 或{enabledelayedexpansion | disabledelayedexpansion},ERRORLEVEL 变量将设置成0,如果是其他无效参数,设置为1 。

单独的不带参数的setlocal仅仅进开启环境变量的局部化。

如果带上参数,还可以同时开启命令环境的局部化,比如关闭命令拓展、开启变量延迟扩展等。

范例3 使用变量延迟扩展(看不懂以后慢慢看,后面会讲到)

统计文件夹个数,同时统计文件夹中的文件个数。

@echo off

SETLOCAL enabledelayedexpansion

SET /A m=0,n=0

FOR /r %%i in (.) do (

SET /A n+=1

pushd %%i

FOR /r %%a in (*) do (

SET /A m+=1)

echo %%~fi--------------------文件个数:!m!&SET m=0

)

批处理命令格式

批处理命令格式.txt人永远不知道谁哪次不经意的跟你说了再见之后就真的再也不见了。一分钟有多长?这要看你是蹲在厕所里面,还是等在厕所外面……echo 表示显示此命令后的字符 echo off 表示在此语句后所有运行的命令都不显示命令行本身 @与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。 call 调用另一个批处理文件(如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续 rem 表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考用的(相当于程序中的注释)。 例1:用edit编辑a.bat文件,输入下列内容后存盘为c: a.bat,执行该批处理文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。 批处理文件的内容为: 命令注释: @echo off 不显示后续命令行及当前命令行 dir c: *.* >a.txt 将c盘文件列表写入a.txt call c: ucdos ucdos.bat 调用ucdos echo 你好显示"你好" pause 暂停,等待按键继续 rem 准备运行wps 注释:准备运行wps cd ucdos 进入ucdos目录 wps 运行wps 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”。 %[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。例2:C:根目录下有一批处理文件名为f.bat,内容为: @echo off format %1 如果执行C: >f a: 那么在执行f.bat时,%1就表示a:,这样format %1就相当于format a:,于是上面的命令运行时实际执行的是format a: 例3:C:根目录下一批处理文件名为t.bat,内容为: @echo off type %1 type %2 那么运行C: >t a.txt b.txt %1 : 表示a.txt %2 : 表示b.txt 于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 特殊命令 if goto choice for是批处理文件中比较高级的命令,如果这几个你用得很熟练,你就是批

DOS批处理命令大全

写批处理 扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。 ==== willsort 编注======================================= .bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。 =================================== 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS 提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 ==== willsort 题注=================== 批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普通数据性文件,这缘于wind ows系统这个新型解释平台的涉入,使得批处理的应用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行环境中,否则很多观念和设定都需要做比较大的变动。 ======================== 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 ==== willsort 编注================== 批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码,但只有编译连接后的exe 文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。 =========================== 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序。 ==== willsort 编注===== 纯以dos系统而言,可执行程序大约可以细分为五类,依照执行优先级由高到低排列分别是:DOSKEY宏命令(预先驻留内存),https://www.wendangku.net/doc/3f10802994.html,中的内部命令(根据内存的环境随时进驻内存),以com为扩

批处理:FOR参数F之tokens详解

批处理:FOR参数F之tokens详解.txt37真诚是美酒,年份越久越醇香浓烈;真诚是焰火,在高处绽放才愈显美丽;真诚是鲜花,送之于人,手有余香。批处理:FOR参数/F之tokens 详解(原创) (四)tokens=x,y,m-n 提取列 附:谢谢大家对本教程的热爱和支持,经过不懈的努力,我对该教程进行了重新修改,有时间放上来与大家分享,敬请关注本空间《甲兵时代》原创作品! 格式: FOR /F "tokens=x,y,m-n" %%I IN (Command1) DO Command2 用法: 一句话总结:提取列。 通俗讲,共同提取每一行的第m小节的内容。 因此,可以用该命令来指定提取文本信息。 tokens=有时表示提取全部。 tokens=m表示提取第m列。 tokens=m,n表示提取第m列和第n列。 tokens=m-n表示提取第m列至第n列。 Tokens=*表示删除每行前面的空格。忽略行首的所有空格。 tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。 tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。 输出变量的个数由定义了的tokens决定。 在 FOR 语句中显式声明 %%i。使用tokens= 隐式声明%%j 和%%k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用tokens= 可以指定最多 26 个输出变量。

接着前面的例子“静夜思”。 如果我要提取第三小节“举头望明月”,如何做到? @echo off for /f "delims=, tokens=3" %%i in (静夜思.txt) do echo %%i pause>nul 讲解: 首先用delims=,表示命令要用逗号作为诗句的分隔符将四句分成四小节。然后用tokens=3提取第三小节,即“举头望明月”了。 delims=和tokens=共用一对双引号,如果单独用双引号,则FOR命令返回的只能是它们之中的一个。因为在第一节说过,FOR是逐一读取命令的,将delims和tokens分开后,FOR只能一次读取一个,不能一次全部读取。 注意: Tokens常和delims一起使用。 首先,一行内容被delims用分割符号如逗号等分隔成许多小段或小节。 然后,tokens才能提取每行之间对应的这些小段或小节——列。具体看下面例子。 例:提取前面例子文本“a.txt”中每行的第三段内容“ccc”、“kkk”、“ggg”、“考试”。 @echo off for /f "skip=1 delims=,, tokens=3" %%i in (a.txt) do echo %%i pause>nul 注意:为什么kkk不出现呢? 例:如何屏蔽掉文本“a.txt”中的标点符号? @echo off

批处理基础知识

批处理文件基础知识 一、单符号message指定让MS-DOS在屏幕上显示的正文 ~ ①在for中表示使用增强的变量扩展。 ②在%var:~n,m%中表示使用扩展环境变量指定位置的字符串。 ③在set/a中表示一元运算符,将操作数按位取反。 ! ①在set /a中一元运算符,表示逻辑非。比如set /a a=!0,这时a就表示逻辑1。 @ ①隐藏命令行本身的回显,常用于批处理中。 % ①在set /a中的二元运算符,表示算术取余。 ②命令行环境下,在for命令in前,后面接一个字符(可以是字母、数字或者一些特定字符),表示指定一个循环或者遍历指标变量。 ③批处理中,后接一个数字表示引用本批处理当前执行时的指定的参数。 ④其它情况下,%将会被脱去(批处理)或保留(命令行) ^ ①取消特定字符的转义作用,比如& | > < ! "等,但不包括%。比如要在屏幕显示一些特殊的字符,比如> >> | ^ &等符号时,就可以在其前面加一个^符号来显示这个^后面的字符了,^^就是显示一个^,^|就是显示一个|字符了; ②在set/a中的二元运算符,表示按位异或。 ③在findstr/r的[]中表示不匹配指定的字符集。 & ①命令连接字符。比如我要在一行文本上同时执行两个命令,就可以用&命令连接这两个命令。 ②在set/a中是按位与。 : ①标签定位符,表示其后的字符串为以标签,可以作为goto命令的作用对象。比如在批处理文件里面定义了一个":begin"标签,用"goto begin"命令就可以转到":begin"标签后面来执行批处理命令了。 ②在%var:string1=string2%中分隔变量名和被替换字串关系。 | ①管道符,就是将上一个命令的输出,作为下一个命令的输入."dir /a/b |more"就可以逐屏的显示dir命令所输出的信息。 ②在set/a中的二元运算符,表示按位或。 ③在帮助文档中表示其前后两个开关、选项或参数是二选一的。 / ①表示其后的字符(串)是命令的功能开关(选项)。比如"dir /s/b/a-d"表示"dir"命令指定的不同的参数。 ②在set/a中表示除法。 > ①命令重定向符,将其前面的命令的输出结果重新定向到其后面的设备中去,后面的设备中的内容被覆盖。比如可以用"dir > lxmxn.txt"将"dir"命令的结果输出到"lxmxn.txt"这个文本文件中去。 ②在findstr/r中表示匹配单词的右边界,需要配合转义字符\使用。 < ①将其后面的文件的内容作为其前面命令的输入。 ②在findstr/r中表示匹配单词的左边界,需要配合转义字符\使用。 . ①在路径的\后紧跟或者单独出现时:

最全批处理命令学习资料【完美版】

一:批处理文件 批处理文件是扩展名为·bat或·cmd的文本文件,包含一条或多条命令,由DOS或Windows系统内嵌的命令解释器来解释运行。 批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。 二:常用命令: 1.echo 和@: @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显,一般批处理第一行都是这个 echo on #从下一行开始打开回显 echo #显示当前是echo off 状态还是echo on 状态 echo. #输出一个”回车换行”,空白行 #(同echo, echo; echo+ echo[ echo] echo/ echo") 2.errorlevel echo %errorlevel% 每个命令运行结束,可以用这个命令行格式查看返回码 默认值为0,一般命令执行出错会设errorlevel 为1 目录操作类命令: 3.dir 显示磁盘目录命令 dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件

dir c: /a:d #显示C 盘当前目录中的目录 dir c: /a:-d #显示C 盘根目录中的文件 dir c:" /b/p #/b只显示文件名,/p分页显示 dir c:" /b/p #/w不显示详细信息 dir *.exe /s #显示当前目录和子目录里所有的.exe文件 4.以树形显示当前路径文件夹结构 tree /f #显示每个文件夹中文件的名字。 5.md 建立子目录 md d:"a"b"c #如果d:"a 不存在,将会自动创建中级目录 #如果命令扩展名被停用,则需要键入mkdir "a"b"c 6.cd 改变当前目录(进入) cd \ #进入根目录 cd #显示当前目录 cd /d d:\sdk #可以同时更改盘符和目录 cd .. #返回上一级目录 7.rd 删除子目录命令 rd abc #删除当前目录里的abc 子目录,要求为空目录rd /s/q d:\temp #删除d:"temp 文件夹及其子文件夹和文件/q安静模式 磁盘操作类命令: 8.format 磁盘格式化命令 9.chkdsk 检查磁盘当前状态命令

实用批处理(bat)教程

目录 第一章批处理基础 第一节常用批处理内部命令简介 1、REM 和:: 2、ECHO 和@ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和: 9、FIND 10、START 11、assoc 和ftype 12、pushd 和popd 13、CALL 14、shift 15、IF 16、setlocal 与变量延迟(ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION 启动或停用延缓环境变量扩展名。) 17、ATTRIB显示或更改文件属性 第二节常用特殊符号 1、@命令行回显屏蔽符 2、%批处理变量引导符 3、> 重定向符 4、>>重定向符 5、<、>、<& 重定向符 6、|命令管道符 7、^转义字符 8、组合命令 9、& 组合命令 10、||组合命令 11、\"\"字符串界定符 12、, 逗号 13、; 分号 14、() 括号 15、! 感叹号 第二章FOR命令详解 一、基本格式 二、参数/d仅为目录 三、参数/R递归(文件名) 四、参数/L迭代数值范围 五、参数/F迭代及文件解析 第三章FOR命令中的变量

一、~I- 删除任何引号(\"),扩展%I 二、%~fI- 将%I 扩展到一个完全合格的路径名 三、%~dI- 仅将%I 扩展到一个驱动器号 四、%~pI- 仅将%I 扩展到一个路径 五、%~nI- 仅将%I 扩展到一个文件名 六、%~xI- 仅将%I 扩展到一个文件扩展名 七、%~sI- 扩展的路径只含有短名 八、%~aI- 将%I 扩展到文件的文件属性 九、%~tI- 将%I 扩展到文件的日期/时间 十、%~zI- 将%I 扩展到文件的大小 十一、%~$PATH:I 第四章批处理中的变量 一、系统变量 二、自定义变量 第五章set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章if命令讲解 第一种用法:IF [NOT] ERRORLEVEL number command 第二种用法:IF [NOT] string1==string2 command 第三种用法:IF [NOT] EXIST filename command 第四种用法:IF增强的用法 第七章DOS编程高级技巧 一、界面设计 二、if…else…条件语句 三、循环语句 四、子程序 五、用ftp命令实现自动下载 六、用7-ZIP实现命令行压缩和解压功能 七、调用VBScript程序 八、将批处理转化为可执行文件 九、时间延迟 1、利用ping命令延时 2、利用for命令延时 3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内 4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内 十、模拟进度条 十一、特殊字符的输入及应用 十二、随机数(%random%)的应用技巧 十三、变量嵌套与命令嵌套 1、更正了所有的错别字,适当排版,增加条理性。

批处理命令及参数学习与使用

无敌的批处理 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cm d。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.ex e按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。 一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。 语法 echo [{on|off}] [message] Sample:@echo off / echo hello world 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 2.@ 命令 表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。 Sample:@echo off @echo Now initializing the program,please wait a minite... @format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。) 3.Goto 命令 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。 语法:goto label (label是参数,指定所要转向的批处理程序中的行。) Sample: if {%1}=={} goto noparms if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。) @Rem check parameters if null show usage :noparms echo Usage: monitor.bat ServerIP PortNumber goto end 标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 4.Rem 命令 注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别

windows批处理文件(.bat&)

bat是dos下的批处理文件 .cmd是nt内核命令行环境的另一种批处理文件 从更广义的角度来看,unix的shell脚本以及其它操作系统甚至应用程序中由 外壳进行解释执行的文本,都具有与批处理文件十分相似的作用,而且同样是 由专用解释器以行为单位解释执行,这种文本形式更通用的称谓是脚本语言。 所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语言都 是一样的,只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序 仍然沿用批处理这一称呼,而其内容和扩展名与dos的批处理却又完全不同。 =================================== 首先批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部 分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批 处理文件。 ==== 注 =================== 批处理文件中完全可以使用非dos命令,甚至可以使用不具有可执行特性的普 通数据性文件,这缘于windows系统这个新型解释平台的涉入,使得批处理的 应用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行 环境中,否则很多观念和设定都需要做比较大的变动。 ======================== 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句(for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分 有限的,也是十分不规范的。批处理的程序语句就是一条条的DOS命令(包括 内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 ==== 注 ================== 批处理文件(batch file)也可以称之为批处理程序(batch program),这一点与编译型语言有所不同,就c语言来说,扩展名为c或者cpp的文件可以称之为 c语言文件或者c语言源代码,但只有编译连接后的exe文件才可以称之为c 语言程序。因为批处理文件本身既具有文本的可读性,又具有程序的可执行性,这些称谓的界限是比较模糊的。 =========================== 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所 在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个

批处理进阶之变量和参数

目录 批处理进阶之变量和参数 第一节基本概念 1、数据类型 2、常量和变量 3、参数和参数变量 第二节变量的分类 1、环境变量 2、参数变量 3、迭代变量 第三节SET命令详细用法 1、显示、设置或删除环境变量 2、/P 交互模式开关与菜单设计 3、/A 数学开关与简单数学计算 第四节增强的变量引用 1、增强的环境变量引用 2、增强的参数变量/循环变量引用 第五节参数传递和漂移 1、参数传递 2、参数漂移 第六节变量的局部化 1、SETLOCAL和ENDLOCAL 2、环境变量延迟扩展

====================================================================== 第一节基本概念 本节内容推荐有一定的批处理基础或者编程基础的人看。 1 数据类型 任何程序都是由指令和数据组成的,类推到批处理上面就是命令和数据了。 数据有类型之分,不同类型的数据在计算机内部的存储方式,取值范围和支持的运算都是不同的。 从目前来看,批处理涉及的数据类型有两种:字符串类型、数字类型。 字符串类型:任意数量的字符,可以用双引号来界定一个字符串,这在很多语言里面是通用的。 例子:s、doom "12.3+78" "TRUE LOVE"。 字符串类型可以进行字符运算,例如替换、合并等。 数字类型:批处理支持数字类型为整数。 例如60、312 等。 数字类型可以进行数学计算,而数字形式的字符串是不能直接进行数学计算的。 批处理是一种“弱类型”的脚本语言。它的数据类型极少,而且对数据类型的界定也很模糊。目前批处理已经实现数据类型的自动化处理,即在需要时可以自动转化数据类型,而这个转换过程用户是感觉不到的。用户完全不必理会数据的类型或者数据类型是否需要转化,或者我们可以简单理解为批处理只有一种数据类型——字符串类型。其实这是脚本类语言的共同特点,“弱类型”大大简化了脚本代码。 2 常量和变量 借用其他高级编程语言的概念,来分析一下批处理里面的常量和变量…… 根据运行时存储位置所存储的值能否被改变,我们可以把数据可以分为常量(数据)和变量(数据)。 常量是系统内置的或用户预定义的,在执行过程中其值是明确而唯一的,不能被改变。例如,"hello"等字符(串)都是系统内置常量,可以直接使用,不一定需要标识符。批处理里面的常量概念很弱,也没有相关的操作命令支持自定义常量,因此可以不理会常量。 变量也是由系统或者用户预定义的,但其存储的内容在运行期间可以发生改变。批处理里面的变量都必须有标识符,即变量名,每一个变量名都指向一个具体的存储空间。变量名或由系统预定义,或由用户自定义。批处理中,变量的设置(定义,初始化,赋值)一般是通过SET语句来完成的。由于批处理是“弱类型”脚本语言,定义变量时不必理会变量的类型,命令解释器会自动决定使用哪种类型或者在使用时自动完成类型转换。 在批处理中使用变量,有两重好处: (1)用简单的名称替代复杂的字符,简化代码。 (2)使用统一的代码段,通过改变变量值来实现重用。 3 参数和参数变量

目前为止最全的批处理教程

目录 第一章 批处理基础 第一节 常用批处理内部命令简介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系统设备 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 14、shift 15、IF 16、setlocal 与 变量延迟(ENABLEDELAYEDEXPANSION / DISABLEDELAYEDEXPANSION 启动或停用延缓环境变量扩展名。) 17、ATTRIB显示或更改文件属性 第二节 常用特殊符号

1、@命令行回显屏蔽符 2、%批处理变量引导符 3、> 重定向符 4、>>重定向符 5、<、>、<& 重定向符 6、|命令管道符 7、^转义字符 8、组合命令 9、& 组合命令 10、||组合命令 11、\"\"字符串界定符 12、, 逗号 13、; 分号 14、() 括号 15、! 感叹号 第二章 FOR命令详解 一、基本格式 二、参数 /d仅为目录 三、参数 /R递归(文件名) 四、参数 /L迭代数值范围 五、参数 /F迭代及文件解析 第三章 FOR命令中的变量

一、 ~I- 删除任何引号(\"),扩展 %I 二、 %~fI- 将 %I 扩展到一个完全合格的路径名 三、 %~dI- 仅将 %I 扩展到一个驱动器号 四、 %~pI- 仅将 %I 扩展到一个路径 五、 %~nI- 仅将 %I 扩展到一个文件名 六、 %~xI- 仅将 %I 扩展到一个文件扩展名 七、 %~sI- 扩展的路径只含有短名 八、 %~aI- 将 %I 扩展到文件的文件属性 九、 %~tI- 将 %I 扩展到文件的日期/时间 十、 %~zI- 将 %I 扩展到文件的大小 十一、 %~$PATH:I 第四章 批处理中的变量 一、系统变量 二、自定义变量 第五章 set命令详解 一、用set命令设置自定义变量 二、用set命令进行简单计算 三、用set命令进行字符串处理 1、字符串替换 2、字符串截取 第六章 if命令讲解 第一种用法:IF [NOT] ERRORLEVEL number command

windows批处理命令详解及脚本实例

批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT。第一部分:批处理内部命令 1、REM REM 是个注释命令一般是用来给程序加上注解的,该命令后的内容在程序执行的时候将不会被显示和执行。例: REM 你现在看到的就是注解,这一句将不会被执行。在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。 2、ECHO ECHO 是一个回显命令主要参数有OFF和ON,一般用ECHO message来显示一个特定的消息。例: Echo off Rem 以上代表关闭回显即不显示所执行的命令 Echo 这个就是消息。 Rem 以上代表显示"这就是消息"这列字符 执行结果: C:\>ECHO.BAT 这个就是消息。 3、GOTO GOTO 即为跳转的意思。在批处理中允许以":XXX"来构建一个标号然后用GOTO :标号直接来执行标号后的命令。例 :LABEL REM 上面就是名为LABEL的标号。 DIR C:\ DIR D:\ GOTO LABEL REM 以上程序跳转标号LABEL处继续执行。 4、CALL CALL 命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后再继续

执行原来的批处理。例: 批处理2.BAT内容如下: ECHO 这就是2的内容 批处理1.BAT内容如下: ECHO 这是1的内容 CALL 2.BAT ECHO 1和2的内容全部显示完成 执行结果如下: C:\>1.BAT 这是1的内容 这就是2的内容 1和2的内容全部显示完成 5、PAUSE PAUSE 停止系统命令的执行并显示下面的内容。例: C:\> PAUSE 请按任意键继续. . . 6、IF IF 条件判断语句,语法格式如下: IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command 说明: [NOT] 将返回的结果取反值即"如果没有"的意思。 ERRORLEVEL 是命令执行完成后返回的退出值 Number 退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于或等于指定的值时条件成立。 string1==string2 string1和string2都为字符的数据,英文字符的大小写将看做不同,这个条件中的等于号必须是2个(绝对相等),条件想等后即执行后面的command EXIST filename 为文件或目录存在的意思。 IF ERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL来

批处理常用命令及用法大全_-__打印

注:如果对某一命令还不是很熟悉,可以在命令行窗口下输入:命令名/?的方式来获得帮助。 1 echo 和 @回显控制命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on #从下一行开始打开回显 echo #显示当前是 echo off 状态还是 echo on 状态echo. #输出一个"回车换行",一般就是指空白行 echo hello world #输出hello world "关闭回显"是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果批处理开始和结束时,系统都会自动打开回显 2 errorlevel程序返回码 echo %errorlevel%每个命令运行结束,可以用这个命令行格式查看返回码用于判断刚才的命令是否执行成功默认值为0,一般命令执行出错会设 errorlevel 为1 3 dir显示目录中的文件和子目录列表 dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 dir c: /a:d #显示 C 盘当前目录中的目录 dir c:\ /a:-d #显示 C 盘根目录中的文件 dir d:\mp3 /b/p #逐屏显示 d:\mp3 目录里的文件,只显示文件名,不显示时间和大小 dir *.exe /s显示当前目录和子目录里所有的.exe文件其中 * 是通配符,代表所有的文件名,还一个通配符 ? 代表一个任意字母或汉字如 c*.* 代表以 c 开头的所有文件?.exe 代表所有文件名是一个字母的.exe文件如果指定的目录或文件不存在,将返回 errorlevel 为1;每个文件夹的 dir 输出都会有2个子目录 . 和 ... 代表当前目录.. 代表当前目录的上级目录 dir . #显示当前目录中的文件和子目录 dir .. #显示当前目录的上级目录中的文件和子目录 其它参数可参考 dir /? 4 cd更改当前目录 cd mp3 #进入当前目录中的mp3 目录 cd .. #进入当前目录中的上级目录 cd\ #进入根目录 cd #显示当前目录 cd /d d:\mp3 #可以同时更改盘符和目录 cd "Documents and Settings"\All users文件名带空格,路径前需要加上引号!!如果更改到的目录不存在,则出错返回 errorlevel=1 5 md创建目录 md abc #在当前目录里建立子目录 abc md d:\a\b\c #如果 d:\a 不存在,将会自动创建 6 rd删除目录 rd abc #删除当前目录里的 abc 子目录,要求为空目录 rd /s/q d:\temp #删除 d:\temp 文件夹及其子文件夹和文件,不需要按 Y 确认 7 del删除文件 del d:\test.txt #删除指定文件,不能是隐藏、系统、只读文件 del *.*删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认 del /q/a/f d:\temp\*.*删除 d:\temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 del /q/a/f/s d:\temp\*.*删除 d:\temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 8 ren文件重命名 ren 1.txt 2.bak #把 1.txt 更名为 2.bak ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件 ren d:\temp tmp #支持对文件夹的重命名 9 cls清屏 10 type显示文件内容 type c:\boot.ini #显示指定文件的内容,程序文件一般会显示乱码 type *.txt #显示当前目录里所有.txt文件的内容 11 copy拷贝文件 XCOPY复制组文件 COPY复制文件 拷贝目录和文件——xcopy 在拷贝单个文件时,可以使用copy命令完成,但当我们要成批拷贝文件,甚至连同子目录一起拷贝时,就要用到xcopy。 copy c:\test.txt d:\复制 c:\test.txt 文件到 d:\ copy c:\test.txt d:\test.bak复制 c:\test.txt 文件到 d:\ ,并重命名为 test.bak copy c:\*.*复制 c:\ 所有文件到当前目录,不包括隐藏文件和系统文件不指定目标路径,则默认目标路径为当前目录 copy con test.txt从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件con代表屏幕,prn 代表打印机,nul代表空设备 copy 1.txt + 2.txt 3.txt合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件如果不指定 3.txt ,则保存到 1.txt 1

批处理命令For循环命令详解

分类:2010-06-11 13:0416793人阅读(0) 批处理for命令详解 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数%%变量名IN (相关文件或命令) DO 执行的命令 参数:FOR有4个参数/d /l /r /f 他们的作用我在下面用例子解释 %%变量名:这个变量名可以是小写a-z或者大写A-Z,他们区分大小写,FOR会把每个读取到的值给他; IN:命令的格式,照写就是了; (相关文件或命令) :FOR要把什么东西读取然后赋值给变量,看下面的例子 do:命令的格式,照写就是了! 执行的命令:对每个变量的值要执行什么操作就写在这. 可以在CMD输入for /看系统提供的帮助!对照一下 FOR %%variable IN (set) DO command [command-parameters] %%variable 指定一个单一字母可替换的参数。 (set) 指定一个或一组文件。可以使用通配符。 command 指定对每个文件执行的命令。 command-parameters 为特定命令指定参数或命令行开关。 现在开始讲每个参数的意思 /d 仅为目录 如果Set (也就是我上面写的"相关文件或命令") 包含通配符(* 和),将对与Set 相匹配的每个目 录(而不是指定目录中的文件组)执行指定的Command。 系统帮助的格式:FOR /D %%variable IN (set) DO command 他主要用于目录搜索,不会搜索文件,看这样的例子 @echo off for /d %%i in (*) do @echo %%i pause 把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!

批处理常用命令及用法大全

批处理常用命令及用法大全 说明:本文来自网络,由youxi01整理,由liqiochi修改完善。 阅读本文需要一定的dos基础概念,象:盘符、文件、目录(文件夹)、子目录、根目录、当前目录每个命令的完整说明请加/? 参数参考微软的帮助文档可以看到,在/? 帮助里,"命令扩展名"一词会经常出现"命令扩展名"是指相对于win98的dos版本而言,每个命令新增的功能 命令测试环境win2000proSP4win98的命令功能太少,就不作研究了 注:如果对某一命令还不是很熟悉,可以在命令行窗口下输入:命令名/?的方式来获得帮助。 例如:对dir命令的应用不熟悉,可以在命令行窗口下输入:dir /? 参数只列举常用参数。 注:errorlevel,msd,undelete在win7下不存在。 目录 1.echo 和@回显控制命令 (3) 2.shutdown 关机 (3) 3.dir显示目录中的文件和子目录列表 (4) 4.cd更改当前目录 (4) 5.md创建目录 (5) 6.rd删除目录 (5) 7.del删除文件 (5) 8.ren文件和文件夹重命名 (6) 9.cls清屏 (6) 10.type显示文件内容 (6) 11.copy拷贝文件(只能复制文件) (6) 12.title设置cmd窗口的标题 (7) 13.ver显示系统版本 (7) https://www.wendangku.net/doc/3f10802994.html,bel 和vol设置卷标 (7) 15.pause暂停命令 (7) 16.rem 和::注释命令 (7) 17.date 和time日期和时间 (8) 18.goto 和:跳转命令 (8) 19.find (外部命令)查找命令 (8) 20.more (外部命令)逐屏显示 (9) 21.tree显示目录结构 (9) 22.&顺序执行多条命令,而不管命令是否执行成功 (9) 23.&&顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令 . 9 24.||顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令 (9) 25.|管道命令,前一个命令的执行结果输出到后一个命令 (10)

BAT(批处理)文件编写详细手册

BAT(批处理)文件编写详细手册 一、批处理文件简介 首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分时候就好象我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 其次,批处理文件是一种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程,在批处理中也可以使用循环语句 (for)来循环执行一条命令。当然,批处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的。批处理的程序语句就是一条条的 DOS命令(包括内部命令和外部命令),而批处理的能力主要取决于你所使用的命令。 第三,每个编写好的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch 目录(例如C:/BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path中设置上c:/batch,你就可以在任意位置运行所有你编写的批处理程序。 简单的说,批处理的作用就是自动的连续执行多条命令。 二、批处理中常用命令: 1.echo命令:表示显示此命令后的字符。字符不需要使用引号。其中,%和^两个字 符不能显示。 2.Echo off命令:表示在此语句后所有运行的命令都不显示命令行本身。即关闭echo 回显功能。可以使用echo on打开。 3.@命令:它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能 影响当前行)。 4.call命令:调用另一个批处理文件(如果不用call而直接调用别的批处理文件, 那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 5.pause命令:运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续。如果不想显示以上英文提示信息, 可以这样写:pause>null 6.rem命令:表示此命令后的字符为解释行(注释),不执行,只是给自己今后参考 用的(相当于程序中的注释)。 7.::命令:与rem命令等效。 例1:用edit编辑a.bat文件,输入下列内容后存盘为c:/a.bat,执行该批处理 文件后可实现:将根目录中所有文件写入 a.txt中,启动UCDOS,进入WPS等功能。 批处理文件的内容为: 命令注释: @echo off //不显示后续命令行及当前命令行

批处理参数详解

如果没有一定的相关知识恐怕不容易看懂和理解批处理文件,也就更谈不上自己动手编写了 批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称,或者双击该批处理文件,系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用,例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。 一.简单批处理内部命令简介 1.Echo 命令 打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。 语法 echo [{ on|off }] [message] Sample:@echo off / echo hello world 在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 2.@ 命令 表示不显示@后面的命令,在入侵过程中(例如使用批处理来格式化敌人的硬盘)自然不能让对方看到你使用的命令啦。 Sample:@echo off @echo Now initializing the program,please wait a minite... @format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的,可喜的是微软留了个autoset这个参数给我们,效果和/y是一样的。) 3.Goto 命令 指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。 语法:goto label (label是参数,指定所要转向的批处理程序中的行。) Sample: if { %1 }=={ } goto noparms if { %2 }=={ } goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)@Rem check parameters if null show usage :noparms echo Usage: monitor.bat ServerIP PortNumber goto end 标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:用来表示这个字母是标签,goto命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 4.Rem 命令 注释命令,在C语言中相当与/*--------*/,它并不会被执行,只是起一个注释的作用,便于别人阅读和你自己日后修改。 Rem Message Sample:@Rem Here is the description.

相关文档