今天介绍三个命令,call命令、start命令、pushd和popd命令。
call命令,从批处理程序调用另一个批处理程序,还可以调用指定标号后面的所有命令。语法格式:
CALL [drive:][path]filename [batch-parameters]
参数说明:
当被调用的批处理文件与正在执行的批处理文件在同一个目录下时,可以省略被调用批处理文件的盘符和文件路径,即[drive:]和[path]可以不写。
实例:创建2个批处理文件,1.bat和2.bat,在1.bat中调用2.bat
① 1.bat的内容
@echo off
echo 1.bat
call 2.bat
call C:\Users\Administrator\Desktop\BAT\2.bat
pause
② 2.bat的内容
echo off
echo 这是一个2.bat文件
运行1.bat,输出结果:
可以看到,被调用的批处理文件2.bat与正在执行的批处理文件1.bat在同一个目录下时,可以省略被调用批处理文件的盘符和文件路径。
call语句扩展
在命令扩展启用时,call命令可以调用指定标签后面的语句,即调用子程序,语法格式:
CALL :label [arguments]
参数说明:
实例:在批处理脚本1.bat中创建:print标签,然后使用call :print调用该标签。
@echo off
echo 我是1.bat文件
call :print
goto end
:print
echo 这里是print标签的信息
goto :eof
:end
pause
运行结果:
call参数扩展
(1)批处理脚本里的 %* 指出所有的参数,%1指出第一个参数,%2指出第二个参数,以此类推,实例:通过1.bat脚本的call命令调用2.bat并指定参数,列出所有参数和第3个参数;
1.bat的内容
@echo off
echo 第一个bat文件1.bat
call 2.bat arg1 arg2 arg3 arg4 arg5
pause
2.bat的内容
@echo off
echo 第二个bat文件2.bat
echo 所有参数:%*
echo 第3个参数:%3
运行结果:
(2)批处理参数(%n)已被增强,可以使用以下语法:
%~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 的输出行。
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %* 使用。
实例:生成一个临时文件 AA.txt,先将目录 C:\windows 设置为当前目录,调用子程序进行参数扩展;然后再恢复当前目录,调用子程序;观察参数扩展结果;
@echo off
echo 产生一个临时文件 > AA.txt
REM 下行先保存当前目录,再将 c:\windows 设为当前目录
pushd c:\windows
call :sub "AA.txt"
REM 下行恢复前次的当前目录
popd
call :sub AA.txt
pause
rem 删除AA.txt文件
del AA.txt
exit
:sub
echo 删除引号: %1
echo 扩充到路径: %~f1
echo 扩充到一个驱动器号: %~d1
echo 扩充到一个路径: %~p1
echo 扩充到一个文件名: %~n1
echo 扩充到一个文件扩展名: %~x1
echo 扩充的路径指含有短名: %~s1
echo 扩充到文件属性: %~a1
echo 扩充到文件的日期/时间: %~t1
echo 扩充到文件的大小: %~z1
echo 扩展到驱动器号和路径:%~dp1
echo 扩展到文件名和扩展名:%~nx1
echo 扩展到类似 DIR 的输出行:%~ftza1
echo.
goto :eof
运行结果:
start命令作用是启动一个单独的窗口以运行指定的程序或命令。
语法格式:
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
[/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
[/NODE ] [/AFFINITY ] [/WAIT] [/B]
[command/program] [parameters]
参数说明:
“title” 窗口标题栏中显示的标题。
path 启动目录。
B 启动应用程序,但不创建新窗口。应用程序已忽略 ^C 处理。除非应用程序启用 ^C 处理,否则 ^Break 是唯一可以中断该应用程序的方式。
I 新的环境将是传递给 cmd.exe 的原始环境,而不是当前环境。
MIN 以最小化方式启动窗口。
MAX 以最大化方式启动窗口。
SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。
SHARED 在共享内存空间中启动 16 位 Windows 程序。
LOW 在 IDLE 优先级类中启动应用程序。
NORMAL 在 NORMAL 优先级类中启动应用程序。
HIGH 在 HIGH 优先级类中启动应用程序。
REALTIME 在 REALTIME 优先级类中启动应用程序。
ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。
BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。
NODE 将首选非一致性内存结构 (NUMA) 节点指定为十进制整数。
AFFINITY 将处理器关联掩码指定为十六进制数字。进程被限制在这些处理器上运行。当 /AFFINITY 和 /NODE 结合时,会对关联掩码进行不同的解释。指定关联掩码,正如 NUMA 节点的处理器掩码正确移动到零位起始位置一样。进程被限制在指定关联掩码和 NUMA 节点之间的那些通用处理器上运行。如果没有通用处理器,则进程被限制在指定的 NUMA 节点上运行。
WAIT 启动应用程序并等待它终止。
command/program 如果它是内部 cmd 命令或批文件,则该命令处理器是使用 cmd.exe 的 /K 开关运行的。这表示运行该命令之后,该窗口将仍然存在。如果它不是内部 cmd 命令或批文件,则它就是一个程序,并将作为一个窗口化应用程序或控制台应用程序运行。
parameters 这些是传递给 command/program 的参数。
注意:在 64 位平台上不支持 SEPARATE 和 SHARED 选项。
实例:使用 start 命令启动 calc.exe windows系统自带的计算器程序。
@echo off
start calc.exe
运行效果:
关于start命令的其他参数,这里就不一一列举了,大家感兴趣的话自行测试一下吧。
pushd 和 popd 这两个命令一般是同时使用的;
pushd命令:作用是将当前目录的路径保存下来,并且切换到你指定的新目录路径。
popd命令:作用是将当前目录切换到 pushd 命令存储的目录路径。
语法格式:
PUSHD [path | ..]
POPD
参数说明:
实例:使用 pushd命令 切换到 D:\ 盘,然后使用 popd 命令切换到执行 pushd 之前的目录。
@echo off
echo 当前目录是:%cd%
rem 用pushd命令将目录切到”D:\“
pushd "D:\"
echo 切换后的新目录是:%cd%
rem 用popd命令将目录切回执行pushd命令之前的目录
popd
echo 执行pushd命令之前的目录是:%cd%
pause
运行结果: