1.1 批处理的常见命令
(未列举的命令还比较多,请查阅帮助信息)
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与延迟变量
详细信息如下:
1、REM 和:
REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。
其次,:也可以起到rem的注释作用,而且更简洁有效;但有两点需要注意:
第一,任何以冒号:开头的字符行,在批处理中都被视作标号,而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注
释作用,所以::常被用作注释符号,其实:+也
可起注释作用。
第二,与rem不同的是,::后的字符行在执行时不会回显,无论是否用echo on打开命令行回显状态,因为命令解释器不认为他是一个有效的命令行,就此点来看,rem在某些场合下将比::更为适用;另外,rem 可以用于config.sys文件中。
2、ECHO和@
打开回显或关闭回显功能,或显示消息。如果没有任何参数,echo 命令将显示当前回显设置。
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
语法:
echo [{ on | off}] [message]
echo. 此用法将显示一空行,相当于回车,非常有用。
执行echo off将关闭回显,它后面的所有命令都不显示命令本身,只显示执行后的结果,除非执行echo on命令。
执行@echo off不但关闭以后命令的回显,连echo off命令本身也不显示了。
通常以@echo off作为批处理程序的首行。
一般用ECHO MESSAGE 来显示一个特定的消息。
例:
@Echo off
Echo hello
Pause
运行显示:hello
3、PAUSE
PAUSE,玩游戏的人都知道,暂停的意思
在这里就是停止系统命令的执行并显示下面的内容。
例:
PAUSE
运行显示:
请按任意键继续...
要显示其他提示语,可以这样用:
Echo 其他提示语 &pause>nul
4、errorlevel
程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设errorlevel为1
5、title
设置cmd窗口的标题
title 新标题
#可以看到cmd窗口的标题栏变了
6、COLOR
设置默认的控制台前景和背景颜色。
COLOR [attr]
attr指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定--第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0=黑色,1=蓝色,2=绿色,3=湖蓝色,4=红色,5=紫色,6=黄色,7=白色,8=灰色,9=淡蓝色,A=淡绿色,B=淡浅绿色,C=淡红色,D=淡紫色,E=淡黄色,F=亮白色
如果没有给定任何参数,该命令会将颜色还原到CMD.EXE 启动时的颜色。这个值来自当前控制台窗口、/T 开关或DefaultColor注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR会将 ERRORLEVEL设置为1。
例如:"COLOR fc”在亮白色上产生亮红色
7、mode 配置系统设备
配置系统设备。
串行口: MODE COMm[:][BAUD-b] [PARITY=p] [DATA=d] [STOP=s][to=on|off] [xon=on|off] [odsr-on|off][octs=onloff] [dtr=onlofflhs][rts=onloffhs/tg] [idsr=onloff]
设备状态: MODE [device] [/STATUS]
打印重定向: MODE LPTn[:]=COMm[:]
选定代码页: MODE CON[:] CP SELECT=yyy
代码页状态:MODE CON[:] CP [/STATUS]
显示模式: MODE CON[:] [COLS=c] [LINES=n]
击键率: MODE CON[:] [RATE=r DELAY=d]
例:
mode con cols=113 lines=15 & color 9f
此命令设置DOS窗口大小:15行,113列
8、GOTO和:
GOTO会点编程的朋友就会知道这是跳转的意思。
在批处理中允许以“:XXX”来构建一个标号,然后用GOTOXXX跳转到标号:XXX处,然后执行标号后的命令。
例:
if {%1} == { } goto noparms
if "%2" == "" goto noparms
标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是
标签,goto命令就是根据这个冒号(:)来寻找下一
步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。
例:
@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause
运行显示:
1
2
3
4
9.find
在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I][/OFF[LINE]] "string" [[drive:][path]filename[ ...1]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE]不要跳过具有脱机属性集的文件。
"string"指定要搜索的文字串,
[drive:][path]filename指定要搜索的文件。
如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。
Find 常和type命令结合使用
#挑选包含 string 的行
Type [drive:][path]filename | find "string [>tmpfile]
#剔除文件中包含string的行
Type [drive:]path]filename | find /v"string"
#显示文件行数
Type [drive:][path]filename| find /c
以上用法将去除find命令自带的提示语(文件名提示)
例:
@echo off
echo 111 >test.txt
echo 222 >>test.txt
find "111" test.txt
del test.txt
pause
运行显示如下:
--------- TEST.TXT
111
请按任意键继续...
例:
@echo off
echo 111>test.txt
echo 222 >>test.txt
type test.txt | find "111"
del test.txt
pause
运行显示如下:
111
请按任意键继续...
当然可以,以下是您请求复制的内容:
------
10、start 命令详解
start命令在批处理脚本中用于启动一个新的窗口来运行指定的程序或命令。这个命令非常有用,特别是当你需要从当前批处理脚本中分离出一个进程,并且不希望它受到当前脚本执行流程的影响时。
语法
【batch】
start ["title"] [/d path] [/i] [/min] [/max] [/separate | /b] [command/program] [parameters]
• ["title"]:指定新窗口的标题。
• [/d path]:指定启动目录。
• [/i]:尝试以最小化的“焦点”模式运行程序(可能不起作用)。
• [/min]:启动窗口最小化。
• [/max]:启动窗口最大化(Windows Vista 及更高版本)。
• [/separate]:在分离的共享命令行窗口中启动新进程(Windows XP 及更早版本)。
• [/b]:在不创建新窗口的情况下启动应用程序(可能不起作用)。
• [command/program]:要运行的命令或程序。
• [parameters]:传递给命令或程序的参数。
示例解释
1. 启动记事本并指定窗口标题
【batch】
start "我的记事本" notepad.exe
2. 在特定目录中启动命令提示符
【batch】
start /d "C:\Program Files" cmd.exe
3. 最小化启动应用程序
【batch】
start /min calc.exe
4. 尝试在不创建新窗口的情况下启动应用程序(可能不起作用)
【batch】
start /b chrome.exe
注意事项:
• 路径和标题的引号使用:如果路径包含空格,应使用引号。同时指定标题时,标题应放在路径之前并用引号括起来。
• 进程独立性:start命令启动的进程独立于原始批处理脚本运行。
• 窗口显示问题:/b和/min等参数的行为可能因操作系统和应用程序而异。
11、assoc和ftype命令详解
assoc和ftype是批处理脚本中用于管理文件类型关联的两个重要命令。它们允许你查看和修改文件扩展名与文件类型以及文件类型与打开该类型文件的程序之间的关联。
assoc 命令
assoc命令用于显示或修改文件扩展名与文件类型之间的关联。
语法
【batch】
assoc [.ext[=fileType]]
• .ext:要显示或修改关联的文件扩展名。
• =fileType:可选,指定要与文件扩展名关联的文件类型。
如果不指定=fileType,则assoc会显示指定扩展名当前关联的文件类型。
示例
1. 查看 .txt 扩展名的关联
【batch】
assoc .txt
输出可能类似于.txt=TXTfile,表示.txt扩展名与TXTfile文件类型关联。
2. 修改 .txt 扩展名的关联
【batch】
assoc .txt=MyTextFile
这将.txt扩展名与新的文件类型MyTextFile关联。注意,这并不会实际改变任何文件的打开方式,除非还使用ftype命令指定了如何打开MyTextFile类型的文件。
ftype 命令
ftype命令用于显示或修改文件类型与打开该类型文件的程序之间的关联。
语法
【batch】
ftype [fileType[=[openCommandString]]]
• fileType:要显示或修改关联的文件类型。
• =[openCommandString]:可选,指定用于打开该文件类型的命令字符串。
如果不指定=[openCommandString],则ftype会显示指定文件类型当前关联的打开命令。
示例
1. 查看 TXTfile 类型的关联
【batch】
ftype TXTfile
输出可能类似于TXTfile="%SystemRoot%\System32\NOTEPAD.EXE" %1,表示TXTfile类型的文件使用 Notepad 程序打开,并且%1是传递给 Notepad 的参数(即要打开的文件名)。
2. 修改 TXTfile 类型的关联
【batch】
ftype TXTfile="%SystemRoot%\System32\wordpad.exe" %1
这将TXTfile类型的文件与 WordPad 程序关联起来。现在,当你双击一个.txt文件(假设它的关联仍然是TXTfile)时,它将使用 WordPad 打开。
综合示例
假设你想要将.txt文件与 WordPad 关联起来,并希望这个更改在双击.txt文件时生效,你可以按照以下步骤操作:
1. 使用assoc命令修改.txt扩展名的关联:
【batch】
assoc .txt=MyTextFile
2. 使用ftype命令指定如何打开MyTextFile类型的文件:
【batch】
ftype MyTextFile="%SystemRoot%\System32\wordpad.exe" %1
现在,当你双击一个.txt文件时,它将使用 WordPad 打开。不过,通常不需要为常见的文件类型创建新的文件类型名称(如MyTextFile),你可以直接修改现有的文件类型(如TXTfile),如下所示:
【batch】
assoc .txt=TXTfile
ftype TXTfile="%SystemRoot%\System32\wordpad.exe" %1
这样,你就将.txt文件的默认打开程序改为了 WordPad,而无需创建新的文件类型名称。
12、pushd和popd命令详解
pushd和popd是批处理脚本中用于管理目录堆栈的两个命令。它们允许你在多个目录之间快速切换,而无需手动输入完整的路径。
pushd 命令
pushd命令用于将当前目录的路径推送到目录堆栈上,并切换到指定的目录。如果未指定目录,则pushd会将当前目录的路径再次推送到堆栈上(相当于复制当前路径)。
语法
【batch】
pushd [path | "path with spaces"]
• path:要切换到的目录路径。如果包含空格,需要用引号括起来。
示例
1. 切换到 C:\Windows 目录
【batch】
pushd C:\Windows
这将把当前目录的路径推送到堆栈上,并切换到C:\Windows目录。
2. 复制当前目录路径到堆栈(不切换目录)
【batch】
pushd
这不会改变当前目录,但会将当前目录的路径推送到堆栈上。
popd 命令
popd命令用于从目录堆栈上弹出顶部路径,并切换到该路径。如果堆栈为空,则popd会失败。
语法
【batch】
popd
示例
1. 从堆栈弹出并切换到之前的目录假设你之前使用了pushd命令切换到了C:\Windows目录,并且之前的目录是C:\Users\YourUsername。
【batch】
popd
这将从堆栈上弹出C:\Windows目录的路径(因为它是最后一个被推送的路径),并切换回C:\Users\YourUsername目录。
综合示例
以下是一个综合示例,展示了如何使用pushd和popd命令在多个目录之间切换。
【batch】
@echo off
echo 当前目录: %cd%
pushd C:\Windows
echo 切换到 C:\Windows 目录
echo 当前目录: %cd%
pushd C:\Program Files
echo 切换到 C:\Program Files 目录
echo 当前目录: %cd%
popd
echo 返回到之前的目录(C:\Windows)
echo 当前目录: %cd%
popd
echo 返回到最初的目录
echo 当前目录: %cd%
运行这个脚本时,你会看到输出如下(具体路径可能因你的系统而异):
当前目录: C:\Users\YourUsername
切换到 C:\Windows 目录
当前目录: C:\Windows
切换到 C:\Program Files 目录
当前目录: C:\Program Files
返回到之前的目录(C:\Windows)
当前目录: C:\Windows
返回到最初的目录
当前目录: C:\Users\YourUsername
这个示例展示了如何使用pushd和popd命令在C:\Users\YourUsername、C:\Windows和C:\Program Files目录之间切换。每次使用pushd时,当前目录的路径都会被推送到堆栈上,而popd则会从堆栈上弹出顶部路径并切换到该路径。
13、CALL
在批处理脚本(batch script)中,call命令用于从一个批处理文件中调用另一个批处理文件或程序,并且在被调用的命令执行完毕后,控制权会返回到原来的批处理文件中继续执行后续命令。
call命令的基本语法
【batch】
call [drive:][path]filename [batch-parameters]
• [drive:][path]filename:指定要调用的批处理文件或程序的路径和名称。
• [batch-parameters]:传递给被调用批处理文件的参数(可选)。
示例解释
示例 1:调用同一目录下的批处理文件
假设有两个批处理文件main.bat和sub.bat,它们都位于同一目录下。
main.bat:
【batch】
@echo off
echo 开始执行 main.bat
call sub.bat
echo sub.bat 执行完毕,继续执行 main.bat
sub.bat:
【batch】
@echo off
echo 正在执行 sub.bat
执行main.bat时,输出将会是:
开始执行 main.bat
正在执行 sub.bat
sub.bat 执行完毕,继续执行 main.bat
在这个例子中,main.bat调用了sub.bat,并在sub.bat执行完毕后继续执行自身的后续命令。
示例 2:调用带有参数的批处理文件
假设有一个批处理文件script.bat,它接受一个参数。
script.bat:
【batch】
@echo off
echo 接收到的参数是:%1
可以在另一个批处理文件中这样调用它:
caller.bat:
【batch】
@echo off
call script.bat HelloWorld
执行caller.bat时,输出将会是:
接收到的参数是:HelloWorld
在这个例子中,caller.bat调用了script.bat并传递了参数HelloWorld。
示例 3:调用外部程序
call命令也可以用于调用外部程序,比如notepad.exe。
example.bat:
【batch】
@echo off
echo 准备打开记事本...
call notepad.exe
echo 记事本已关闭,继续执行后续命令。
执行example.bat时,记事本将会被打开。用户关闭记事本后,才会继续执行后续命令。
注意事项
• 使用call命令调用批处理文件时,被调用的批处理文件中的任何环境变量更改(如set命令)都会在调用结束后保留在原始批处理文件的上下文中(除非使用了setlocal)。
• 如果直接运行另一个批处理文件(不使用call),则控制权不会返回到原始批处理文件,相当于用新的批处理文件替换了当前的执行上下文。
通过call命令,可以在批处理脚本中实现模块化编程,将复杂的任务分解成多个简单的批处理文件来管理和调用。
14、shift
在批处理脚本(batch script)中,shift命令用于在命令行参数列表中移动参数的位置,从而可以逐个处理这些参数。每次使用shift命令时,参数列表中的第一个参数都会被移除,后续的参数则依次向前移动一个位置,%0(批处理文件本身的名称)保持不变。
shift命令的基本语法
【batch】
shift [/n]
• /n:可选参数,指定要移动的参数个数。如果不指定,则默认移动一个参数。
示例解释
示例 1:逐个处理命令行参数
假设有一个批处理文件process_params.bat,它接受多个命令行参数,并逐个打印它们。
process_params.bat:
【batch】
@echo off
:loop
if "%~1"=="" goto endloop
echo 当前参数: %1
shift
goto loop
:endloop
echo 所有参数已处理完毕。
如果执行process_params.bat arg1 arg2 arg3,输出将会是:
当前参数: arg1
当前参数: arg2
当前参数: arg3
所有参数已处理完毕。
在这个例子中,%~1表示第一个参数(带有引号处理),if "%~1"=="" goto endloop检查是否还有剩余参数。如果有,则打印当前参数并使用shift命令将其移除,然后跳转到:loop继续处理下一个参数。当没有剩余参数时,跳转到:endloop结束处理。
示例 2:使用/n选项移动多个参数
假设有一个批处理文件shift_multiple.bat,它使用/n选项一次性移动多个参数。
shift_multiple.bat:
【batch】
@echo off
echo 初始参数: %1 %2 %3 %4
shift /2
echo 移动两个参数后的参数: %1 %2
如果执行shift_multiple.bat a b c d e,输出将会是:
初始参数: a b c d
移动两个参数后的参数: c d
在这个例子中,shift /2命令将参数列表中的前两个参数(a和b)移除,c和d成为新的前两个参数。
注意事项
• shift命令仅影响%1,%2,%3, ... 等位置参数,不影响%0(批处理文件本身的名称)。
• 使用shift命令时,通常与循环结构(如goto循环或for循环)结合使用,以便逐个处理所有参数。
• 如果批处理文件需要处理带空格或特殊字符的参数,建议使用%~1,%~2, ... 等形式来获取参数值,这些形式会自动处理引号并去除任何周围的空格。
通过shift命令,批处理脚本可以灵活地处理命令行参数,实现各种参数解析和处理的逻辑。
15、IF
在批处理脚本(batch script)中,if命令用于根据条件执行不同的命令。if命令可以检查文件是否存在、字符串是否相等、数字是否满足特定关系等,并根据检查结果执行相应的操作。
if命令的基本语法
1. 检查字符串是否相等
【batch】
if ["string1"]==["string2"] command
注意:方括号是可选的,但推荐使用,因为它们可以防止字符串中的特殊字符(如空格、&、| 等)被解释为命令分隔符或操作符。
2. 检查文件是否存在
【batch】
if exist filename command
3. 检查数字关系
【batch】
if number1 relation number2 command
其中relation可以是==(等于)、neq或ne(不等于)、lss(小于)、leq或le(小于或等于)、gtr(大于)、geq或ge(大于或等于)。
示例解释
示例 1:检查字符串是否相等
【batch】
@echo off
set str1=hello
set str2=world
if ["%str1%"]==["%str2%"] (
echo 字符串相等
) else (
echo 字符串不相等
)
输出:
字符串不相等
在这个例子中,if命令检查两个字符串变量str1和str2是否相等,并根据结果输出相应的消息。
示例 2:检查文件是否存在
【batch】
@echo off
if exist C:\example.txt (
echo 文件存在
) else (
echo 文件不存在
)
输出取决于C:\example.txt文件是否存在。
示例 3:检查数字关系
【batch】
@echo off
set /a num1=5
set /a num2=10
if %num1% lss %num2% (
echo num1 小于 num2
) else (
echo num1 不小于 num2
)
输出:
num1 小于 num2
在这个例子中,if命令检查两个数字变量num1和num2的关系,并根据结果输出相应的消息。
注意事项
• 在比较字符串时,推荐使用方括号[]来包围字符串,以防止特殊字符被错误解释。
• 在比较数字时,可以直接使用变量名,不需要方括号。
• if命令可以与else子句结合使用,以在条件不满足时执行不同的命令。
• 可以使用set /a命令来声明和赋值算术变量。
• 批处理脚本中的变量名是区分大小写的,但在if命令的比较中通常不区分大小写(除非与文件系统操作相关,如检查文件路径)。
通过if命令,批处理脚本可以根据不同的条件执行不同的操作,从而实现更复杂的逻辑和流程控制。
16、setlocal与延迟变量
在批处理脚本(batch script)中,setlocal命令用于启用本地环境变量更改,这意味着在该命令之后所做的任何环境变量更改都仅在当前脚本或代码块的执行期间有效,并且不会影响到调用脚本的外部环境。而延迟变量扩展(Delayed Variable Expansion)则允许你在一个代码块(如for循环或if语句块)内部使用并修改变量,然后在同一块内再次访问其更新后的值。
setlocal命令
setlocal命令通常与endlocal命令一起使用,endlocal命令会结束本地环境变量的更改,并恢复之前的环境状态。这意味着在setlocal和endlocal之间的任何环境变量更改都不会影响到脚本外部。
延迟变量扩展
默认情况下,批处理脚本会在读取一行时立即扩展变量。这意味着如果你在一个代码块内更改了一个变量的值,并试图在同一代码块内再次访问它,你将得到更改前的值,因为扩展是在代码块执行之前完成的。为了解决这个问题,可以使用延迟变量扩展,通过!variable!语法(而不是%variable%)来访问变量,并使用setlocal enabledelayedexpansion命令来启用此功能。
示例解释
以下是一个结合了setlocal和延迟变量扩展的示例:
【batch】
@echo off
setlocal enabledelayedexpansion
set count=0
for /l %%i in (1,1,5) do (
set /a count=!count!+1
echo 第 %%i 次循环,count 的值为 !count!
)
endlocal
echo 循环结束后,count 的最终值(外部)为 %count%
输出:
第 1 次循环,count 的值为 1
第 2 次循环,count 的值为 2
第 3 次循环,count 的值为 3
第 4 次循环,count 的值为 4
第 5 次循环,count 的值为 5
循环结束后,count 的最终值(外部)为 0
在这个例子中:
1. setlocal enabledelayedexpansion启用了延迟变量扩展。
2. set count=0初始化了一个变量count。
3. for /l %%i in (1,1,5) do开始了一个从 1 到 5 的循环。
4. 在循环内部,set /a count=!count!+1使用延迟变量扩展来更新count的值。
5. echo 第 %%i 次循环,count 的值为 !count!输出当前循环次数和更新后的count值。
6. endlocal结束本地环境变量的更改。
7. echo 循环结束后,count 的最终值(外部)为 %count%输出循环结束后count的值(注意这里使用的是%count%,因为它是在endlocal之后访问的,所以显示的是初始值 0)。
通过这个例子,可以看到setlocal和延迟变量扩展如何协同工作,以在代码块内部安全地修改和访问变量,同时确保这些更改不会影响到脚本的外部环境。