I come, I see, I conquer

                    —Gaius Julius Caesar

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

 

 

什么是批处理?

 

      批处理是在DOS1.0开发到最后时刻才诞生的,因为IBM需要一些方法不断测试生产出来的PC,所以希望能够有一种方式能够使电脑自动运行一批命令,而不需要人工的一次次输入,他们把这个意图告诉了微软,于是微软就通过建立来满足了IBM。

 

      在后来出现的DOS系统里面批处理的自动化被更好的体现出来了,DOS系统允许用户使用一种文本编辑将多条DOS命令按顺序以ascⅡ文本写入一个扩展名为bat(ms-DOS批处理)或cmd(WINDOWSnt命令脚本)的文件中,当我们需要使用的时候在提示符下键入文件名并回车,或在WINDOWS界面下双击该文件时系统就会调用command.com或cmd.exe由前向后的依此来自动执行这些命令。而这个命令的集合就是批处理。他是DOS下可的一种。一个完整的批处理是由至少一条可以被正确执行的DOS命令组成,由此可见,DOS命令是批处理的核心。

 

      DOS支持两种不同的模式:1、互动模式   2、批模式(静音模式)

 

举例:

 

C:\>del /p a
C:\a,要删除(Y/N)吗? n

C:\>del /Q a

C:\>

 

 

内部和外部命令

 

      有两种类型的命令,我们可以从命令提示符下运行,他们是内部命令和外部命令。内部命令是内置的命令,操作系统自带的,如ECHO, CLS, DEL, DIR。外部命令往往是安装一个新的应用程序时创建的命令。这些命令主要用于调用该应用程序和支持文件。另外,大部分外部命令能在命令提示符中执行,只有很少的外部命令只能在“运行”对话框中执行。

 

 

命令行命令

 

      批处理文件是由一系列运行在命令行的命令组成,为了写出好的批处理,我们必须知道一些有用的命令行命令。下面列出这些命令和简要描述。

命令                        说明
access.cpl                辅助控制
accwiz                     辅助功能向导
appwiz.cpl               添加/删除程序
ciadv.msc                索引服务
control admintools    管理工具
cleanmgr                 磁盘清理工具
control color            显示属性
compmgmt.msc        计算机管理控制台
control folders          文件夹选项
cliconfg                   SQL客户端配置
certmgr.msc            证书管理器
charmap                  字符映射
chkdsk                    磁盘检查工具
clipbrd                     剪贴板查看器
calc                         打开计算器
cmd                        打开命令提示符
devmgmt.msc          设备管理器
dfrg.msc                  磁盘碎片整理
diskmgmt.msc          磁盘管理
dcomcnfg                 组件服务
ddeshare                 DDE共享
diskpart                   磁盘分区管理
desk.cpl                   显示属性
directx.cpl                Direct X控制面板
dxdiag                     Direct X疑难解答
eudcedit                   私有字符编辑
eventvwr.msc           事件查看器(维护系统日志)
explorer                   打开我的文档
freecell                     接龙游戏
fsquirt                     蓝牙传输向导
fsmgmt.msc             共享文件夹
gpedit.msc               组策略编辑器
hdwwiz.cpl               添加硬件向导
iexplore                   互联网资源管理器
inetcpl.cpl                互联网资源管理器属性
ipconfig                   Windows IP配置
intl.cpl                     区域设置
joy.cpl                     游戏控制器
lusrmgr.msc             本地用户和组
logoff                      注销当前用户
magnify                   打开放大镜

msconfig                 打开系统配置实用程序
msinfo32                 系统信息
mspaint                   打开MSPAINT
msmsgs                  Windows Messenger
mstsc                      远程桌面
mmsys.cpl                声音和音频
mqbkup                   消息队列备份\还原工具
notepad                  打开一个新的记事本
ntmsmgr.msc          可移动存储
ntmsoprq.msc         移动存储操作请求
ncpa.cpl                   网络连接
netsetup.cpl             网络安装向导
odbccp32.cpl           ODBC数据源管理员
proxycfg                 代理配置
packager                 对象包装器
perfmon.msc            性能监视器
powercfg.cpl             电源选项
qappsrv                  显示网络上可用的应用程序终端服务器
qprocess                 显示进程的信息
qwinsta                   显示终端会话信息
rcp                         复制文件到运行RCP服务的计算机,或从该计算机复制文件
recover                   从坏的或有缺陷的磁盘恢复可读信息
relog                      用于登录
replace                    替换文件
rexec                      在运行REXEC服务的远程主机上运行命令
route                      操作网络路由表
rsh                         在运行RSH服务的远程主机上运行命令
rsm                         用可移动存储设备管理多媒体资源
regedit                    打开注册表编辑器
rwinsta                    重启会话
services.msc            管理计算机上的所有服务
sigverif                    文件签名验证工具
secpol.msc               本地安全设置
shutdown                关闭Windows
syskey                    Windows系统安全工具
shrpubw                  共享文件夹向导
sndvol32                 音量控制
sysedit                    Windows.ini, system.ini, config.sys, autoexec.bat
timedate.cpl             日期和时间属性
telephon.cpl             电话和调制解调器选项
telnet                      Telnet客户端
tftp                         与运行TFTP服务的远程计算机相互传送文件
tscon                      附加一个用户会话到一个终端会话
tsdiscon                  从终端服务器断开一个会话
tskill                        结束进程,甚至可以终止进程
tsshutdn                 60秒关机
typeperf                  登录事件时有用,用于监视处理器线程,并写入到指定的日志文件
userinit                    我的文档
verifier                     驱动程序验证工具
winchat                    微软聊天
winmine                   扫雷游戏
wuaucpl.cpl              自动更新
wscui.cpl                 安全中心
wmplayer                 Windows媒体播放器
wmimgmt.msc          Windows管理器的基础设施
winmsd                    系统信息
wupdmgr                 Windows更新的启动
winver                      显示Windows版本
writer                       打开写字板

 

 

批处理的操作符

操作符                             描述
()                                   括号
! ~ -                               单目操作符
* / % + -                        算术运算符(%为批处理变量引导符)
<< >> < >                      逻辑移位或重定向操作符
&                                    按位与,组合命令(顺序执行)
^                                    按位异或,转义字符
|                                     按位或,命令管道符
= *= /= %= += -= &= ^= |= <<= >>=  赋值
,                                     分隔符
&&                                  用于执行多个命令,组合命令(前面指令成功,才执行后面指令)
||                                    用于从多个命令中执行其中一个,组合命令(前面指令失败,才执行后面指令)

 

举例(一):

 

C:\>set /A (7 - 4) * 2 + 23 % 6 / 2
8
C:\>set /A (7 - 4) * 2 + 23 / 6 % 2
7

注意:(1) 执行算术运算时,需要用到带'/A'开关的SET命令
      (2) 运算符存在优先级


举例(二):

    将一个命令的输出重定向到另一个文件用'>'和'<',比如下列命令把文件"hello"定位到一个名为f.txt的记事本中

 

C:\>echo hello > f.txt


举例(三):

    波浪操作符'~'用于缩短长目录名,用于一个目录名的前6个连续字符后面。比如"Documents and Settings"这个目录名超过了8个字符,我们不用敲打命名,只要用'~'系统就能自动识别路径并执行操作。

 

C:\>cd C:\Docume~1

C:\DOCUME~1>

    注意:虽然~是单目操作符,但它后面不带1时是不能用的


举例(四):

    '&&'操作符用于在单行中执行多条命令,比如下列命令用两个不同的echo命令打印'hi'和'hello'。

 

C:\>echo hi && echo hello
hi
hello

C:\>


举例(五):

    '|'操作符将一个命令的输出作为另一个命令的输入。

 

C:\>del /p a
C:\a,要删除(Y/N)吗? n

C:\>echo Y | del /p a
C:\a,要删除(Y/N)吗? Y

C:\>

 

 

基本命令

 

主命令、子命令、开关、参数

 

 

 

新建一个welcome.bat的批处理如下:

 

@echo off
cd\
echo Welcome %1%
pause

输出:

注意:(1) 输入批处理的参数,在批处理文件中用%数字%的形式访问,批处理文件名为%0%,第1个参数为%1%,第2个参数为%2% ,依此类推。
       (2) 用help显示windows支持的可用内部命令,用'/?'可以显示每个命令的帮助信息。

 

 

Rem: 用于注释

举例:

@echo off
Rem Program for printing hello world.
Echo Hello World.
Pause

输出:
Hello World.
请按任意键继续. . .


Echo:显示其后的文本,类型C语言中的printf。有两种状态off和on,默认情况下是on。如果不希望显示C:\>这类东西,可以设成off。


Color:设备命令窗口的背景和前景色。


Title:设备命令窗口的标题。


Prompt: 改变输入窗中的提示符。如:

 

C:\>
C:\>
C:\>prompt $A

&
cd D:
D:\

prompt $G

>
prompt $$

$
$

 

$A & (Ampersand)
$B | (pipe)
$C ( (Left parenthesis)
$D Current date
$E Escape code (ASCII code 27)
$F ) (Right parenthesis)
$G > (greater-than sign)
$H Backspace (erases previous cha
$L < (less-than sign)
$N Current drive
$P Current drive and path
$Q = (equal sign)
$S (space)
$T Current time
$V Windows XP version number
$_ Carriage return and linefeed
$$ $ (dollar sign)


Cls:清屏


Date:修改或显示当前日期。开关'/T'显示日期。


Time:修改或显示当前时间。开关'/T'显示时间。


Start:启动一个应用程序,赋予运行优先级,指定共享或独立内存。

 

 

再如:

C:\>start /min notepad
C:\>start /max mspaint
C:\>start /separate calc
C:\>start /shared write
C:\>start /low winword
C:\>start /normal iexplore.exe
C:\>start /realtime ...
C:\>start /wait tree

 

Call:一个批处理调用另一个批处理。


Tasklist:显示当前运行于后台的所有进程。


Taskkill:终止本地或远程的指定进程。


Label:创建、修改和删除磁盘标签。


Tree:用图形方式显示当前目录结构。


Type:显示文件内容。


Shift:批处理接受参数时,用于将输入的参数从一个位置往下移。


Shutdown:关闭、注销或重启计算机。


At: 对本地或远程计算机上的任务在指定时间进行调度执行。

 

C:\>at \\10.199.64.66 10AM "notepad.exe"
C:\>at
Status ID Day Time Command Line
---------------------------------------------------------------
1 Tomorrow 10:00 AM "notepad.exe"
C:\>at 1 /delete

 


SET:显示、设置或删除cmd.exe环境变量

 

SET [variable=[string]]

  variable  指定环境变量名
  string    指定要指派给变量的一系列字符串

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


(2) SET P会显示所有以字母P打头的变量。如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL设置成1。

C:\>echo %errorlevel%
9009

C:\>set xx
环境变量 xx 没有定义

C:\>echo %errorlevel%
1

C:\>

 

(3) SET命令不允许变量名含有等号


(4) 在 SET 命令中添加了两个新命令行开关:

    SET /A expression                   ; /A 命令行开关指定等号右边的字符串为被评估的数字表达式
    SET /P variable=[promptString] ; /P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。

 

(5) 环境变量替换:

%PATH:str1=str2%

    把变量%PATH%的里的str1全部用str2替换。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

@echo off 
set var=www.google.com
echo before replacement: "%var%" 
echo after replacement:  "%var:.=DOT%" 
pause

输出:

before replacement: "www.google.com"
after replacement:  "wwwDOTgoogleDOTcom"
请按任意键继续. . .

 

(6) 字符串截取

格式:%var:~[m[,n]]%
%   为变量标识符
var 为变量名,不可少
:   用于分隔变量名和说明部分
~   可以简单理解为“偏移”即可
m   为偏移量(缺省为0)
n   为截取长度(缺省为全部)

 

    %PATH:~10,5%

    会提取PATH 变量中从第 11 个(偏移量 10)字符开始的五个字符。如果没有指定长度,则采用默认值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,使用的数字则是环境变量数值长度加上指定的偏移量或长度。

    %PATH:~-10%

    会提取 PATH 变量的最后十个字符。

    %PATH:~0,-2%

    会提取 PATH 变量的所有字符,除了最后两个。

 

    上面所述用法其实相当于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位开始取右边全部。

 

(7) 终于添加了延迟环境变量扩充的支持。该支持总是按默认值被停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。以下例子说明直接变量扩充的问题:

set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )

    不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和"after",这两者永远不会相等。同样,以下这个例子也不会达到预期效果:

set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

    原因是,它不会在目前的目录中建立一个文件列表,而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量是空的。因此,我们真正执行的 FOR 循环是:

for %i in (*) do set LIST= %i

    这个循环继续将 LIST 设成找到的最后一个文件。

    延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果:

set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

    如果命令扩展名被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些名称中任何一个定义变量,那个定义会替代下面描述的动态定义:

    %CD% - 扩展到当前目录字符串。

    %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

    %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

    %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

    %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

    %CMDEXTVERSION% - 扩展到当前命令处理器扩展名版本号。

    %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

 

 

 

环境变量

      环境变量是一种特殊的变量,包含由操作系统、其他应用程序或手动设置的值。设置了环境变量,在程序中调用它们时,可以减少任务和代码的复杂性。因为他们只是占位符。它们保存了像驱动器路径,目前登录的用户名,根驱动器,操作系统名称和版本等值。
      以下列出了xp中的环境变量:

Environment Variables                Description
%ALLUSERSPROFILE%                  C:\Documents and Settings\All Users
%APPDATA%                               C:\Documents and Settings\{username}\Application Data
%CD%                                          Current working directory
%CMDCMDLINE%                          Displays Windows Version
%CMDEXTVERSION%                     Command prompt version
%COMPUTERNAME%                      Equivalent to hostname command
%COMSPEC%                                C:\Windows\System32\cmd.exe
%DATE%                                      Display current date
%ERRORLEVEL%                          Exit code for the previously executed command
%HOMEDRIVE%                            Root Drive
%HOMEPATH%                             \Documents and Settings\{username}
%NUMBER_OF_PROCESSORS%      Displays number of processors
%OS%                                         Displays the name of the OS installed
%PATH%                                     Points to C:\WINDOWS\system32
%PATHEXT%                               .COM; .EXE; .BAT; .CMD; .VBS; .VBE; .JS ; .WSF; .WSH
%PROCESSOR_ARCHITECTURE%    Displays the processor architecture
%PROCESSOR_LEVEL%                 Displays the processor level
%PROCESSOR_REVISION%           Displays the processor revision
%PROMPT%                                  Displays the current prompt
%RANDOM%                                Generates a random integer between 0 and 32767
%SYSTEMDRIVE%                        Moves to the Root drive
%SYSTEMROOT%                         C:\WINDOWS
%TEMP% and %TMP%                   C:\DOCUME~1\{USER}\LOCALS~1\Temp
%TIME%                                      Displays current time
%USERDOMAIN%                         Displays the hostname
%USERNAME%                             Displays the currently logged in user name
%USERPROFILE%                         C:\Documents
%WINDIR%                                 C:\WINDOWS

 

用set可以设置环境变量,如:

 

C:\>set C=C:\windows\system32\cmd.exe
C:\>%C%

 


循环语句FOR

对一组文件中的每一个文件执行某个特定命令。

FOR %variable IN (set) DO command [command-parameters]

  %variable  指定一个单一字母可替换的参数。
  (set)      指定一个或一组文件。可以使用通配符。
  command    指定对每个文件执行的命令。
  command-parameters
             为特定命令指定参数或命令行开关。

在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.

如果命令扩展名被启用,下列额外的 FOR 命令格式会受到支持:

 

FOR /D %variable IN (set) DO command [command-parameters]

    如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。这个参数主要用于目录搜索,不会搜索文件

 

例1:把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示

@echo off 
for /d %%i in (c:\*) do echo %%i 
pause

 

例2:把当前路径下文件夹的名字只有1-3个字母的打出来

@echo off 
for /d %%i in (???) do echo %%i 
pause

注:(1) *号表示任意N个字符,而?号只表示任意一个字符

     (2) /D参数只能显示当前目录下的目录名字,这个大家要注意!

 

 

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

    检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。把当前或者你指定路径下的文件名字全部读取,注意是文件名字。

 

例1:把D盘根目录,和每个目录的子目录下面全部的XLS文件都显示出来

@echo off 
for /r D:\test\ %%i in (*.xls) do echo %%i 
pause

输出:

D:\test\X1.xls
D:\test\F2\X2.xls
D:\test\F3\X3.xls
D:\test\F3\F31\X31.xls
请按任意键继续. . .

 

例2:把bat所在目录,和每个目录的子目录下面全部的XLS文件都显示出来

@echo off 
for /r %%i in (*.xls) do echo %%i 
pause

 

例3:枚举D盘test目录下的所有目录

@echo off 
for /r d:\test %%i in (X31.xls) do echo %%i 
pause

输出:

d:\test\X31.xls
d:\test\F1\X31.xls
d:\test\F2\X31.xls
d:\test\F3\X31.xls
d:\test\F3\F31\X31.xls
d:\test\F3\F32\X31.xls
请按任意键继续. . .

 

例4:只枚举存在X31.xls的目录

@echo off 
for /r d:\test %%i in (X31.xls) do if exist %%i echo %%i 
pause

输出:

d:\test\F3\F31\X31.xls
请按任意键继续. . .

注意:

1、set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。
2、相反,如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管set中的指定文件是否存在。这与前面所说的单点(.)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。

 

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生序列 (5 4 3 2 1)。

 

迭代及文件解析

    使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。

    文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。

    详细的帮助格式为:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

 

    filenameset 为一个或多个文件名。继续到 filenameset 中的下一个文件之前,每份文件都已被打开、读取并经过处理。
    处理包括读取文件,将其分成一行行的文字,然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。您可通过指定可选 "options"参数替代默认解析操作。这个带引号的字符串包括一个或多个指定不同解析选项的关键字。这些关键字为:

        eol=c           - 指一个行注释字符的结尾(就一个)
        skip=n          - 指在文件开始时忽略的行数。
        delims=xxx      - 指分隔符集。这个替换了空格和跳格键的
                          默认分隔符集。
        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                          的 for 本身。这会导致额外变量名称的分配。m-n
                          格式为一个范围。通过 nth 符号指定 mth。如果
                          符号字符串中的最后一个字符星号,
                          那么额外的变量将在最后一个符号解析之后
                          分配并接受行的保留文本。
        usebackq        - 指定新语法已在下类情况中使用:
                          在作为命令执行一个后引号的字符串并且一个单
                          引号字符为文字字符串命令并允许在 filenameset
                          中使用双引号扩起文件名称。

    某些范例可能有助: 

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

    会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
    取得第二个符号,引用 %j 来取得第三个符号,引用 %k来取得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,您还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。

    %i 专门在 for 语句中得到说明,%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,同时不能有 52 个以上都在使用中。

    您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,用单引号将括号之间的 filenameset 括起来。这样,该字符串会被当作一个文件中的一个单一输入行。

    最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进内存,并被当作文件分析。因此,以下例子:

FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i

    会枚举当前环境中的环境变量名称。

 

例1:

@echo off 
rem 首先建立临时文件test.txt 
echo ;注释行,这是临时文件,用完删除 >test.txt 
echo 11段 12段 13段 14段 15段 16段 >>test.txt 
echo 21段,22段,23段,24段,25段,26段 >>test.txt 
echo 31段-32段-33段-34段-35段-36段 >>test.txt 
FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k 
Pause 
Del test.txt

输出:

11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .

说明:

eol=; 分号开头的行为注释行
tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后

 

例2:显示test.txt全部内容,包括注释行

@echo off 
FOR /F "eol= delims=" %%i in (test.txt) do echo %%i 
Pause

 

例3:显示本机全部帐号名字

@echo off 
FOR /F "delims=" %%i in ('net user') do @echo %%i 
pause

注:把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!

 

另外,FOR 变量参照的替换已被增强。您现在可以使用下列选项语法:

     ~I         - 删除任何引号("),扩充 %I
     %~fI        - 将 %I 扩充到一个完全合格的路径名
     %~dI        - 仅将 %I 扩充到一个驱动器号
     %~pI        - 仅将 %I 扩充到一个路径
     %~nI        - 仅将 %I 扩充到一个文件名
     %~xI        - 仅将 %I 扩充到一个文件扩展名
     %~sI        - 扩充的路径只含有短名
     %~aI        - 将 %I 扩充到文件的文件属性
     %~tI        - 将 %I 扩充到文件的日期/时间
     %~zI        - 将 %I 扩充到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩充到
                   空字符串

可以组合修饰符来得到多重结果:

     %~dpI       - 仅将 %I 扩充到一个驱动器号和路径
     %~nxI       - 仅将 %I 扩充到一个文件名和扩展名
     %~fsI       - 仅将 %I 扩充到一个带有短名的完整路径名
     %~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
                   到找到的第一个驱动器号和路径。
     %~ftzaI     - 将 %I 扩充到类似输出线路的 DIR

在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。

 

统一举例:

 

FOR /R C:\Windows\Prefetch %v IN (*.pf) DO del %v

该语句删除位置C:\windows\prefetch下扩展名为.pf的文件。

 

FOR /L %G IN (20,-2,0) DO ECHO %G

该语句循环显示出一个范围内的数字。

 

for /L %%i in (1,1,100) do net user user%%i /add
for /L %%i in (1,1,100) do md c:\test\user%%i
for /L %%i in (1,1,100) do net share user%%i=c:\test\user%%i
for /L %%i in (1,1,100) do cacls c:\test\user%%i /e /c /p user%%i:f

1、创建100个用户,命名为user1—user100
2、创建100个目录,命名为user1—user100
3、将这100个目录共享给这100个用户
4、设置这100个目录的安全权限给这100个用户

注:cacls命令用来显示或者修改文件的访问控制表(ACL),用C:\>cacls /?可查看帮助信息

 

FOR /F "tokens=*" %v IN ('dir/b ^"c:\a^"') DO ECHO %v

列出位于C:\a目录下的所有目录和文件。

 

FOR /F "delims==" %v IN ('tasklist') DO @ ECHO %v

显示运行于后台的所有进程。

 

FOR /F "tokens=1,3* delims=," %v IN ("Cybercrawler,Prem,E-Book,Batch") DO @ ECHO %v wrote %w

取出标记'Cybercrawler'和'E-Book'放入%v和%w,并与wrote一块输出。

 

 


条件语句IF和IFNOT

 

举例:

@echo off
:begin
color a
echo Access Code :
set /p ac=
if %ac%==12345 (
echo Access Granted
else (
echo Access Denied
goto begin
)
Pause

 

输出:

Access Code :
1
Access Denied
Access Code :
12345
Access Granted
请按任意键继续. . .

 

 

参考资料:http://xiangkg.blog.163.com/blog/static/5668850420101268115584/

 

 

 

批处理代码示例

 

@echo off
cls
title 终极多功能修复
:menu
cls
color 0A
echo.
echo              ==============================
echo              请选择要进行的操作,然后按回车
echo              ==============================
echo.
echo              1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
echo.
echo              2.病毒专杀工具,端口关闭工具,关闭自动播放
echo.
echo              3.清除所有多余的自启动项目,修复系统错误
echo.
echo              4.清理系统垃圾,提高启动速度
echo.
echo              Q.退出
echo.
echo.
:cho
set choice=
set /p choice=          请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
if /i "%choice%"=="1" goto ip
if /i "%choice%"=="2" goto setsave
if /i "%choice%"=="3" goto kaiji
if /i "%choice%"=="4" goto clean
if /i "%choice%"=="Q" goto endd
echo 选择无效,请重新输入
echo.
goto cho

 

 

@echo off
call :randomPassword 6 pass1 pass2 pass3
echo %pass1% %pass2% %pass3%
pause
exit

:randomPassword
::---------生成随机密码
::
---------%1为密码长度,%2及以后为返回变量名称
::
---------goto循环、变量嵌套、命令嵌套
@echo off
if "%1"=="" goto :eof
if %1 lss 1 goto :eof
set password_len=%1
set return=
set wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循环
:randomPassword1
set /a numof=%random%%%36
call set return=%return%%%wordset:~%numof%,1%%
set /a password_len-=1
if %password_len% gtr 0 goto randomPassword1
::---------------------------循环
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof

 

实例三:批量ping

对多个ip地址进行ping,并将ping不通的ip及描述信息输出。

ip.txt文件的内容为:

192.168.1.2;数据库服务器1
192.168.1.3;数据库服务器2
192.168.1.4;数据库服务器3
192.168.1.5;数据库服务器4

ping的批处理脚本为:

@echo off
if exist ping_out_ip* del /q ping_out_ip*
echo.>> ping_out_ip_%date:~0,10%.text //echo.表示输出一个回车换行
echo.>> ping_out_ip_%date:~0,10%.text
echo ping不通的ip地址表:>> ping_out_ip_%date:~0,10%.text
echo ------------------------------------------------->> ping_out_ip_%date:~0,10%.text
echo.>> ping_out_ip_%date:~0,10%.text
FOR /F "tokens=1,2 delims= "  %%i in (ip.txt) do (
ping %%i -n 2
if errorlevel 1 echo %%i %%j >> ping_out_ip_%date:~0,10%.text)
start ping_out_ip_%date:~0,10%.text//运行完后打开文本看结果

测试结果示例:

 

ping不通的ip地址表:
-------------------------------------------------

192.168.1.3 数据库服务器2
192.168.1.5 数据库服务器4

登录后运行计划任务,并且要求后台运行。使用VBS脚本

set ws=WScript.CreateObject("WScript.Shell")
ws.Run "c:\ping测试.bat",0

posted on 2012-03-07 12:23  jcsu  阅读(3616)  评论(0)    收藏  举报