当前位置:文档之家› 批处理入门

批处理入门

一、关于当前路径: %cd% %~dp0,前者可用于批处理文件和命令行中,后者只用于批处理文件。
例:比如在D盘下有个批处理文件,a.bat,其内容为:
echo this is %%cd%% %cd%;
echo this is %%~dp0 %~dp0;
在c:\下运行a.bat后输出:
c:\>d:\a.bat
this is %cd% c:\
this is %~dp0 d:\
二、关于!!用法
REM 感叹号其实就是变量百分号(%)的强化版。之所以要用!而不用%,是因为在for循环中,当一个变量被多次赋值时,
REM %dd%所获取的仅仅是dd第一次被赋予的值;要想刷新dd的值,就必须首先通过
REM 命令"setlocal enabledelayedexpansion"来开启延迟变量开关,然后用!dd!来获取dd的值。
setlocal enabledelayedexpansion --开启延迟变量开关
FOR /R d: %%i IN (.) DO (
set dd=%%i
set dd=!dd:~0,-1! -- !dd:~0!代表整个%dd%变量的值,!dd:~0,-1!表示从第0位取到倒数第1位; !dd:~-3!表示取最后3位。
echo !dd!
)

@echo 1. echo命令 on将回显本条命令,默认为on; off后将不显示本条命令
echo 将回显本条命令
echo off
echo 看不到本条命令,只能直接看到输出

@echo 2. @不显示后面的命令,但命令合法会执行. 类似于echo off后执行命令
@ dir /w

@echo 3. rem注释
@rem 这里是注释,前台不显示

@echo 4. call从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call 命令接受用作调用目标的标签
call test.bat
dir /w

@echo 5. start调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用
start test.bat
dir /w/p

@echo 6. for 在命令行中使用%variable,在bat文件中使用%%variable
@rem 显示当前目录下所有*.txt,*.bat的内容
for %%i in (*.txt,*.bat) do type %%i
@rem 得到当前目录下的所有子目录但不递归
for /D %%i in (*) do @echo %%i
@rem 递归得到当前目录下的所有子目录,带全路径
for /R %%i in (.) do @echo %%i
@rem 以增量执行循环
for /L %%i in (1,1,5) do @echo %%i
for /L %%i in (5,-1,1) do @echo %%i
@rem 解析文件集合,读取文本行然后将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代程序变量值,调用 for 循环
@rem 使用选项usebackq:表明可使用`‘“三个字符引用集合,否则将视为文本字符串。其中文件名用""扩起来,字符串用''扩起来,命令用``扩起来。
@rem delims==:指定每行内的分隔符为=,也可以指定为空格或逗号
@rem eol=;表明行尾字符是分号
@rem skip=n表明跳过开头n行
@rem tokens=2,3,m-n: 表示引用delims分隔符后,将分隔后的各独立字符串解析成了令牌,此处只需要传递第2,3,m-n个。
@rem 例一:读取环境变量集合集set,并显示环境变量名称
for /F "usebackq delims==" %%i in (`set`) do @echo %%i
for /F "usebackq d

elims== tokens=1,2,*" %%i in (`set`) do @echo %%i
@rem 例二:读取环境变量的值
for /F "usebackq delims== tokens=2" %%i in (`set`) do @echo %%i
@rem 例二:读取环境变量的键值对
for /F "usebackq delims== tokens=1,2" %%i in (`set`) do @echo %%i == %%j
@rem 例三:对任意变量i,可进行扩展。如/D %%i in (*) do @echo %%i,其中%%i=test01
@rem %~I 展开删除任何前后引号 ("") 的 %I。
@rem %~fI 将 %I 展开到完全合格的路径名。 ;D:\help\os\test\test01
@rem %~dI 只将 %I 展开到驱动器号。 ;D:
@rem %~pI 只将 %I 展开到路径。 ;\help\os\test\
@rem %~nI 只将 %I 展开到文件名。 ;test01
@rem %~xI 只将 %I 展开到文件扩展名。 ;
@rem %~sI 展开路径以只包含短名称。 ;D:\help\os\test\test01
@rem %~aI 将 %I 展开到文件的文件属性。 ;
@rem %~tI 将 %I 展开到文件的日期和时间。 ;2010-12-12 11:09
@rem %~zI 将 %I 展开到文件大小。 ;0
@rem %~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开到第一个找到的完全合格的名称。如果没有定义环境变量名称,或搜索没有找到文件,则此修改程序扩展成空字符串。
@rem %~dpI 只将 %I 展开到驱动器号和路径。 ;D:\help\os\test\
@rem %~nxI 只将 %I 展开到文件名和扩展名。 ;test01
@rem %~fsI 将 %I 展开到只包含短名称的完整路径名。
@rem %~dp$PATH:I 在 PATH 环境变量中所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径。
@rem %~ftzaI 将 %I 展开到输出行(如 dir一样)。
@rem 例四,备份文件,写一个backup.bat,内容如下。再写一个backup.lst,指定要备份的目录,可以有多行,如:“E:\project\ssh”
for /F "eol=; tokens=1-4 delims=/ " %%i in ('date/T') do @"C:\Program Files\WinRAR\WinRAR.exe" a -r "f:\backup\yutech\%%i-%%l%%k%%j.rar" @f:\backup\backup.lst



@echo 7. 批处理参数: 一般从1%到 9%这九个。其参数扩展同for命令,如%~dpi
@rem 例一:显示第一个参数
@echo off
if "%1" == "abc" echo "%1"
@rem 例二:将内容从f1拷贝到f2,xcopy C:\f1\*.* D:\f2,用批处理命令:mybatch.bat C:\f1 D:\f2,则mybatch.bat内容为:
xcopy %1\*.* %2


@echo 8. goto语句
@echo 例一:如果没有输入参数,则提示;否则显示
@echo off
if "%1" == "" goto input
echo "你输入的第一个参数:%1"
goto comp
:input
echo "请输入参数"
:comp

@echo 9. if语句,有多种用法
@rem 1) if [not] string1==string2 command [else expression]
if "abc"=="abc" echo =
if not "abc"=="abcd" echo !=
@echo off
if defined %1 (echo %1已定义) else (echo 没有定义%1环境变量)
@rem 2) if [not] exist filename command [else expression]
if exist test.bat echo 当前目录下有test.bat
if not exist test.bat echo 当前目录下没有test.bat
if not exist test0 echo 没有test0这个

目录
@rem 3) if [not] errorlevel number command [else expression]
@rem 只有当由运行的前一个程序返回值大于或等于 number 时,才为真。
@rem DOS程序运行时都会返回一个数字给DOS,称为错误码errorlevel或称返回码,常见的返回码为0、1。0为成功,1为失败
@echo off
format a:
if not errorlevel 1 goto succ
echo 执行失败,返回值为%errorlevel%
goto end
:succ
echo 执行成功,返回值为%errorlevel%
:end
@rem 4) if [/i] string1 compareop string2 command [else expression]
@rem /i强制字符串比较忽略大小写。CompareOp有:EQU 等于 NEQ 不等于 LSS 少于 LEQ 少于或等于 GTR 大于 GEQ 大于或等于
@rem 5) if defined variable command [else expression]
@rem 如果定义了 variable,则指定条件为真。
@rem %errorlevel% 扩展到 errorlevel 当前值的字符串表达式,如果没有名为 ERRORLEVEL 的环境变量,就可取代它的值。
@rem %cmdcmdline% 在任何 Cmd.exe 处理之前扩展传递到 Cmd.exe 的源命令行,如果没有名为 cmdcmdline 的环境变量,就可取代它的值。
@rem %cmdextversion% 扩展到 cmdextversion 当前值的字符串表达式,如果没有名为 CMDEXTVERSION 的环境变量,就可取代它的值。
@echo off
if defined java_home goto yes
echo 没有定义java_home环境变量
goto end
:yes
set s=已定义java_home环境变量,其值为:
echo %s% %java_home%
:end

@echo 10. 组合命令
@rem 1) 第一条命令 & 第二条命令 [& 第三条命令...]
dir z: & dir c:\
@rem 2) 第一条命令 && 第二条命令 [&& 第三条命令...]
@rem 用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
@rem 3) 第一条命令 ││ 第二条命令 [││ 第三条命令...]
@rem 用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
@rem 4) 第一条命令 │ 第二条命令 [│ 第三条命令...]
@rem 将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见
(date /t && time /t) >> c:\my.txt
(if exist c:\my.txt del c:\my.txt) & if errorlevel 0 echo succ!
netstat -anp udp | find "4500"
@rem 列出所有的端口,然后传递给find命令去找到4500端口号
@rem 5) >、>>输出重定向命令,区别在于,>会清除调原有文件中的内容后写入指定文件,而>>只会追加内容到指定文件中,而不会改动其中的内容
@echo off
c:
cd c:\system32
dir *.exe>exeback.txt & dir *.dll>dllback.txt
dir *.exe>exeback1.txt & dir *.dll>dllback1.txt
fc exeback.txt exeback1.txt>diff.txt & fc dllback.txt dllback1.txt>diff.txt
@rem 定期比较system32目录下的exe与dll文件
@echo 6) < 从文件中而不是从键盘中读入命令输入。>& 将一个句柄

的输出写入到另一个句柄的输入中。<& 从一个句柄读取输入并将其写入到另一个句柄输出中

例一: 拷贝指定目录下的文件并打包的例子
@if exist jar rd /S/Q jar
@if exist appfx.jar del /F/Q appfx.jar
@mkdir .\jar\cn\com\jbbis
@for /D %%i in (bin\cn\com\jbbis\*) do @if /i not %%~ni equ tools xcopy /c/q/s/i %%~si jar\cn\com\jbbis\%%~ni
cd jar
jar cf0 ..\appfx.jar .
cd ..
rd /S/Q jar
pause

相关主题
文本预览
相关文档 最新文档