什么是批处理?
批处理是在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:\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 打开写字板
批处理的操作符
操作符 描述
() 括号
! ~ - 单目操作符
* / % + - 算术运算符(%为批处理变量引导符)
<< >> < > 逻辑移位或重定向操作符
& 按位与,组合命令(顺序执行)
^ 按位异或,转义字符
| 按位或,命令管道符
= *= /= %= += -= &= ^= |= <<= >>= 赋值
, 分隔符
&& 用于执行多个命令,组合命令(前面指令成功,才执行后面指令)
|| 用于从多个命令中执行其中一个,组合命令(前面指令失败,才执行后面指令)
举例(一):
8
C:\>set /A (7 - 4) * 2 + 23 / 6 % 2
7
注意:(1) 执行算术运算时,需要用到带'/A'开关的SET命令
(2) 运算符存在优先级
举例(二):
将一个命令的输出重定向到另一个文件用'>'和'<',比如下列命令把文件"hello"定位到一个名为f.txt的记事本中
举例(三):
波浪操作符'~'用于缩短长目录名,用于一个目录名的前6个连续字符后面。比如"Documents and Settings"这个目录名超过了8个字符,我们不用敲打命名,只要用'~'系统就能自动识别路径并执行操作。
C:\DOCUME~1>
注意:虽然~是单目操作符,但它后面不带1时是不能用的
举例(四):
'&&'操作符用于在单行中执行多条命令,比如下列命令用两个不同的echo命令打印'hi'和'hello'。
hi
hello
C:\>
举例(五):
'|'操作符将一个命令的输出作为另一个命令的输入。
C:\a,要删除(Y/N)吗? n
C:\>echo Y | del /p a
C:\a,要删除(Y/N)吗? Y
C:\>
基本命令
主命令、子命令、开关、参数
新建一个welcome.bat的批处理如下:
cd\
echo Welcome %1%
pause
输出:
注意:(1) 输入批处理的参数,在批处理文件中用%数字%的形式访问,批处理文件名为%0%,第1个参数为%1%,第2个参数为%2% ,依此类推。
(2) 用help显示windows支持的可用内部命令,用'/?'可以显示每个命令的帮助信息。
Rem: 用于注释
举例:
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:\>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 /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
Status ID Day Time Command Line
---------------------------------------------------------------
1 Tomorrow 10:00 AM "notepad.exe"
C:\>at 1 /delete
SET:显示、设置或删除cmd.exe环境变量
variable 指定环境变量名
string 指定要指派给变量的一系列字符串
(1) 要显示当前环境变量,键入不带参数的SET
(2) SET P会显示所有以字母P打头的变量。如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL设置成1。
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替换。要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的开始到 str1 剩余部分第一次出现的地方,都一直保持相配。
set var=www.google.com
echo before replacement: "%var%"
echo after replacement: "%var:.=DOT%"
pause
输出:
after replacement: "wwwDOTgoogleDOTcom"
请按任意键继续. . .
(6) 字符串截取
% 为变量标识符
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 /?
考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境变量扩充是很有用的,而不是执行的时候。以下例子说明直接变量扩充的问题:
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",这两者永远不会相等。同样,以下这个例子也不会达到预期效果:
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
原因是,它不会在目前的目录中建立一个文件列表,而只是将LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量是空的。因此,我们真正执行的 FOR 循环是:
这个循环继续将 LIST 设成找到的最后一个文件。
延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面例子写成以下所示,以达到预期效果:
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:\>%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盘根目录下的全部目录名字打印出来,而文件名字一个也不显示
for /d %%i in (c:\*) do echo %%i
pause
例2:把当前路径下文件夹的名字只有1-3个字母的打出来
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文件都显示出来
for /r D:\test\ %%i in (*.xls) do echo %%i
pause
输出:
D:\test\F2\X2.xls
D:\test\F3\X3.xls
D:\test\F3\F31\X31.xls
请按任意键继续. . .
例2:把bat所在目录,和每个目录的子目录下面全部的XLS文件都显示出来
for /r %%i in (*.xls) do echo %%i
pause
例3:枚举D盘test目录下的所有目录
for /r d:\test %%i in (X31.xls) do echo %%i
pause
输出:
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的目录
for /r d:\test %%i in (X31.xls) do if exist %%i echo %%i
pause
输出:
请按任意键继续. . .
注意:
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
中使用双引号扩起文件名称。
某些范例可能有助:
会分析 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,其输出会被抓进内存,并被当作文件分析。因此,以下例子:
会枚举当前环境中的环境变量名称。
例1:
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
输出:
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .
说明:
eol=; 分号开头的行为注释行
tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
例2:显示test.txt全部内容,包括注释行
FOR /F "eol= delims=" %%i in (test.txt) do echo %%i
Pause
例3:显示本机全部帐号名字
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 的大写变量名比较易读,而且避免与不分大小写的组合键混淆。
统一举例:
该语句删除位置C:\windows\prefetch下扩展名为.pf的文件。
该语句循环显示出一个范围内的数字。
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 /?可查看帮助信息
列出位于C:\a目录下的所有目录和文件。
显示运行于后台的所有进程。
取出标记'Cybercrawler'和'E-Book'放入%v和%w,并与wrote一块输出。
条件语句IF和IFNOT
举例:
: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/
批处理代码示例
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
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

浙公网安备 33010602011771号