十一, pushd 和 popd
说明:
pushd path, 将指定路径path 压栈, 然后 切换到指定路径
popd, 弹栈, 并切换到弹出的路径.
1, pushd
概念:
先保存当前目录以供 POPD 命令使用,再改到指定的目录。
格式:
PUSHD [path | ..]
path 指定要成为当前目录的目录。
2, popd
概念:
更改到 PUSHD 命令存储的目录。
格式:
POPD
举例:
C:\Windows\System32>cd /d d:\cmd
d:\cmd>mkdir dir
d:\cmd>cd dir
d:\cmd\dir>pushd d:\cmd
d:\cmd>pushd d:\
d:\>popd
d:\cmd>popd
十二, assoc 和 ftype
a.txt => txtfile => notepad.exe
文件 文件类型 执行(解析)程序
说明:1)双击 "a.txt"文件 ->.txt;
2)判断该文件的文件类型 ->txtfile;
3)调用执行txtfile类型文件的程序打开a.txt->notepad.exe
1, assoc
概念:
显示或修改文件扩展名关联
格式:
ASSOC [.ext[=[fileType]]]
即: 1) assoc
2) assoc .ext
3) assoc .ext=
4) assoc .ext=fileType
说明:
.ext : ext, extend的前三个字母, 扩展名的意思
fileType: 该有该扩展名的文件 是什么类型.
举例:
d:\cmd>assoc // 显示所有扩展名 关联的 文件类型
d:\cmd>assoc .jar // 显示 ".jar" 结尾的文件 的文件类型
.jar=jarfile
d:\cmd>assoc .txt // 显示 ".txt" 结尾的文件 的文件类型
.txt=txtfile
d:\cmd>assoc .jar= // 删除 ".jar" 结尾的文件 的文件类型
d:\cmd>assoc .jar
没有为扩展名 .jar 找到文件关联
d:\cmd>assoc .jar=jarfile // 设置 ".jar"结尾的文件 的文件类型
.jar=jarfile
d:\cmd>assoc .jar
.jar=jarfile
2, ftype
概念:
显示或修改用在文件扩展名关联中的文件类型.
格式:
FTYPE [fileType[=[openCommandString]]]
fileType 指定要检查或改变的文件类型
openCommandString 指定调用这类文件时要使用的开放式命令。
说明:
1.txt文件的扩展名是 .txt
.txt 的文件类型 txtfile
txtfile类型文件用 notepad.exe 打开
在一个开放式命令字符串之内,
命令字符串 %0 或 %1 被通过关联调用的文件名所代替。
%* 得到所有的参数,%2 得到第一个参数,%3 得到第二个,等等。
%~n 得到其余所有以 nth 参数打头的参数;n 可以是从 2 到 9 的数字。
举例:
d:\cmd>ftype txtfile
txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1
d:\cmd>notepad 1.txt // 用notepad打开
d:\cmd>"E:\EditPlus 3\EditPlus.exe" 1.txt // 用editplus打开
d:\cmd>ftype jarfile
jarfile="D:\Java\jre7\bin\javaw.exe" -jar "%1" %*
注意:
这只是设置文件关联, 而不是设置默认打开程序
十三, call
概念:
从批处理程序调用另一个批处理程序。
格式:
CALL [drive:][path]filename [batch-parameters]
batch-parameters 指定批处理程序所需的命令行信息。
调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
如果命令扩展被启用,CALL 会如下改变:
CALL 命令现在将卷标当作 CALL 的目标接受。语法是:
CALL:label arguments
调用本文件内命令段,相当于子程序。
被调用的命令段以标签":label" 开头, 以命令"goto :eof" 结尾。
说明:
%~1 - 删除引号("),扩展 %1
%~f1 - 将 %1 扩展到一个完全合格的路径名
%~d1 - 仅将 %1 扩展到一个驱动器号
%~p1 - 仅将 %1 扩展到一个路径
%~n1 - 仅将 %1 扩展到一个文件名
%~x1 - 仅将 %1 扩展到一个文件扩展名
%~s1 - 扩展的路径只含有短名
%~a1 - 将 %1 扩展到文件属性
%~t1 - 将 %1 扩展到文件的日期/时间
%~z1 - 将 %1 扩展到文件的大小
%~$PATH:1 - 查找列在 PATH 环境变量的目录,并将 %1
扩展到找到的第一个完全合格的名称。如果
环境变量名未被定义,或者没有找到文件,
此修改符会扩展到空字符串
可以组合修改符来取得多重结果:
%~dp1 - 只将 %1 扩展到驱动器号和路径
%~nx1 - 只将 %1 扩展到文件名和扩展名
%~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
并扩展到找到的第一个文件的驱动器号和路径。
%~ftza1 - 将 %1 扩展到类似 DIR 的输出行。
举例:
@echo off
echo 产生一个临时文件 > temp.txt
rem 先保存当前目录, 再将 c:\windows 设为当前目录
pushd c:\windows
call :sub temp.txt
rem 恢复目录
rem popd
rem call :sub "temp.txt"
pause
del temp.txt
exit
:sub
rem call %0 %1 : 第0个参数,%0 是":sub", 第1个参数,%1 是 temp.txt
rem echo 原始: %1
rem 去掉参数的引号
rem echo 删除引号: %~1
rem 当前路径 "c:\windows", 结果-> c:\windows
rem echo 扩充到路径: %~f1
rem 当前路径"c:\windows", 结果-> c
rem echo 扩充到一个驱动器号: %~d1
rem 当前路径"c:\windows", 结果-> :\windows\
rem echo 扩充到一个路径(不带盘符): %~p1
rem 结果-> temp
rem echo 扩充到一个文件名: %~n1
rem 结果-> .txt
rem echo 扩充到一个文件扩展名: %~x1
rem 结果-> c:\Windows\temp.txt
rem echo 当前路径+短文件名 %~s1
rem echo 文件属性:%~a1
rem echo 日期/时间 : %~t1
rem 结果-> c:\Windows\
rem echo 扩展到驱动器号和路径 : %~dp1
rem 结果-> temp.txt
rem echo 扩展到文件名和扩展名: %~nx1
rem echo 扩展到类似dir的输出行: %~ftza1
goto :eof
举例:
C:\Windows\System32>cd /d d:\cmd
d:\cmd>set var=123
d:\cmd>%var%
'123' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
d:\cmd>set cmdstr=echo %var%
d:\cmd>%cmdstr%
123
d:\cmd>call %cmdstr%
123
十四, shift
概念:
更改批处理文件中可替换参数的位置。
格式:
SHIFT [/n]
说明:
如果命令扩展被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。例如:
SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
举例:
@echo off
echo =========sub1==========
call :sub1 var1 var2 var3
echo =========sub2==========
call :sub2 var1 var2 var3
pause
:sub1
echo %0
echo %1
echo %2
echo %3
goto :eof
:sub2
echo %1
shift
echo %1
shift
echo %1
goto :eof
十五, if
格式:
if [not] errorLevel number commond
if [not] string1==string2 commond
if [not] exist filename commond
说明:
1, if [not] errorLevel number commod
1) if errorLevel 必须紧跟在一个命令之后
2) 执行命令后, 由 if errorLevel 来判断命令的返回值
3) number的 范围为 0~255
4) 判断时, 值的排列顺序 必须从大到小
5) 返回值 等于 number 时,成立
举例:
@echo off
dir
rem dir2
rem 返回代码为 1, 跳转到 :1 处执行; 返回代码为 2, 跳转到 :2 处执行.
rem 此处两行 不可交换位置, 否则失败了也显示成功
if errorLevel 1 goto 1
if errorLevel 2 goto 2
:0
echo 命令执行成功!
goto exit
:1
echo 命令执行失败!
goto exit
:exit
pause
2, if [not] string1==string2 commond
1) string1 和 string2 都是字符数据
2) 区分大小写
3) 相当 即可执行 commond命令
4) 防止左右无意出现空格, 可:
① if [not] {string1}=={string2} commond
② if [not] [string1]==[string2] commond
③ if [not] "string1"=="string2" commond
说明: 这种写法,其实是把"{}","[]"当成了string的一部分.
举例:
d:\cmd\01>if a=a echo ok // 应该写成 "=="
此时不应有 =a。
d:\cmd\01>if a==a echo ok
ok
d:\cmd\01>if not a==b echo ok
ok
d:\cmd\01>if "a"=="a" echo ok
ok
d:\cmd\01>if 'a'=='a' echo ok
ok
3, if [not] exist filename commond
概念:
文件/目录 存在, 则执行 commond
if [not] exist filename (
commond1
) else (
commond2
)
举例:
d:\cmd\01>del 1.txt
找不到 d:\cmd\01\1.txt
d:\cmd\01>echo 11 > 1.txt
d:\cmd\01>if exist 1.txt (echo 文件存在!) else echo 文件不存在!!!
文件存在!
d:\cmd\01>del 1.txt
d:\cmd\01>if exist 1.txt (echo 文件存在!) else echo 文件不存在!!!
文件不存在!!!
5.bat=>
if exist 1.bat (
echo 1.bat 存在
) else (
echo 1.bat 不存在
)
if exist ak (
echo ak 存在
) else (
echo ak 不存在
)
4, 如果命令扩展行被启用, if会如下改变:
1) if [/i] string1 compare-op string2 commond
/i : 不区分大小写
compare-op:
equ, 等于
neq, 不等于
lss, 小于
leq, 小于或等于
gtr, 大于
geq, 大于或等于
2) if cmdextversion number commond
3) if defined variable commond
举例:
d:\cmd\01>set a=123
d:\cmd\01>if defined a echo 定义了a
定义了a
补充, 命令扩展
CMD
/E:ON 启用命令扩展
/E:OFF 停用命令扩展
命令扩展是按默认值启用的。
您也可以使用 /E:OFF,为某一特定调用而停用扩展。
您可以在机器上和/或用户登录会话上启用或停用 CMD.EXE 所有调用的扩展,
这要通过设置使用REGEDT32.EXE 的注册表中的一个或两个 REG_DWORD 值:
HKEY_LOCAL_MACHINE\Software\Microsoft\Command rocessor\EnableExtensions
和
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions
到 0x1 或 0x0。用户特定设置比机器设置有优先权。
命令行开关比注册表设置有优先权。
命令行扩展包括对下列命令所做的更改和/或添加:
DEL 或 ERASE
COLOR
CD 或 CHDIR
MD 或 MKDIR
PROMPT
PUSHD
POPD
SET
SETLOCAL
ENDLOCAL
IF
FOR
CALL
SHIFT
GOTO
START (同时包括对外部命令调用所做的更改)
ASSOC
FTYPE
十六, setLocal 与 变量延迟
1, setLocal
概念:
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后
所做的环境改动只限于批处理文件。要还原原先的设置,必须执
行 ENDLOCAL。达到批处理文件结尾时,对于该批处理文件的每个
尚未执行的 SETLOCAL 命令,都会有一个隐含的 ENDLOCAL 被执行。
2, 变量延迟
概念:
例子 1, 结果: 4
@echo off
set a=4
set a=5 & echo %a% // 预处理-> set a=5 & echo 4
pause
说明:
批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例 1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量 a 赋了值,那么 %a% 当然就是 4 了!(没有为什么,批处理就是这样做的。)而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例子 2, 结果5
@echo off
setLocal enableDelayedExpansion
set a=4
set a=5 & echo !a!
pause
说明:
启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion ”,并且变量要用一对叹号“!! ”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。分析一下例 2,首先“setlocalenabledelayedexpansion ”开启变量延迟,然后“set a=4 ”先给变量 a 赋值为4,“ set a=5 & echo !a!”这句是给变量 a 赋值为 5 并输出(由于启动了变量延迟,所以批处理能够感知到动态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时 a 的值就是 5 了)。
例子 3, 交换两变量的值
@echo off
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2% & set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause
十七, attrib
概念:
显示或更改 文件属性
格式:
ATTRIB [+R | -R]
[+A | -A]
[+S | -S]
[+H | -H]
[+I | -I]
[drive:][path][filename]
[/S [/D] [/L]]
说明:
+ 设置属性。
- 清除属性。
R 只读文件属性。
A 存档文件属性。
S 系统文件属性。
H 隐藏文件属性。
I 无内容索引文件属性。
[drive:][path][filename]
指定 attrib 要处理的文件。
/S 处理当前文件夹及其所有子文件夹中的匹配文件。
/D 也处理文件夹。
/L 处理符号链接和符号链接目标的属性。
例子:
mkdir autorun
attrib +a +s +h autorun
建立文件夹 autorun,然后将其设为存档、系统、隐藏属性