bat文件一些最为基础的一些语法,稍微看看方便学习工作
echo
在屏幕上打印“hello world”
echo hello world
@
在当前行的命令前加上@之后不会在命令行窗口中显示当前路径
call
从一个批处理程序调用其他批处理程序,而不终止原来的程序。
call D:\Commonsoftware\Anaconda\Scripts\activate.bat
call activate myenv
其中,myenv
是需要激活的环境名称。
call [[Drive:] [Path] FileName [BatchParameters]] [[:label] [arguments]]
pause
在执行完命令后显示“请按任意键继续···”字样。该命令一般用来调试程序,确保批处理代码在执行中没有出现任何问题。常放在 bat 文件末尾和其他想终止程序的地方。
rem
bat 文件注释。与::等效
set
set xxx="c:\"
rem 将xxx的值赋为c:\
dir /w %xxx%
rem %变量% 是引用变量的格式 dir /w %xxx% 显示路径下的文件
set xxx=
rem 删除名为xxx的变量
goto
goto label
:label
module
start
start [“title”] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
“title” 指定在“命令提示符”窗口标题栏中显示的标题。
/dpatch 指定启动目录。
/i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。
/min 启动新的最小化窗口。
/max 启动新的最大化窗口。
/separate 在单独的内存空间启动 16 位程序。
/shared 在共享的内存空间启动 16 位程序。
/low 以空闲优先级启动应用程序。
/normal 以一般优先级启动应用程序。
/high 以高优先级启动应用程序。
/realtime 以实时优先级启动应用程序。
/abovenormal 以超出常规优先级的方式启动应用程序。
/belownormal 以低出常规优先级的方式启动应用程序。
/wait 启动应用程序,并等待其结束。
start "title"
if
批处理中执行条件处理的语句。首先,需要了解 bat 文件中比较运算符的有效值。
@echo off
set /a a=123
set /a b=456
if %a% geq %b% (
echo %a%^>=%b%
) else (
echo %a%^<%b%
)
pause
需要注意的是,if 语句后的括号必须要写在与其同一行的末尾。
此外,在进行字符串比较时,if 后加 /i
命令可强制字符串比较时忽略大小写。
choice
此命令本意是显示信息并暂停批处理程序,让用户在做一些交互的选择。比如 Anaconda 中安装 Python 包时的提示是否安装的 [y/n] 就是利用的这个命令。
有时,利用此命令占用内存较小、计时较为精确的特点,可以用此命令进行计时,程序会等待特定的时间,再执行下面的命令。以下语句表示等待 10 秒再执行批处理程序。
choice /t 10 /d y /n >nul
值得注意的是,用该命令计时有个缺陷:只能计时 0~9999 秒之内的时间(约 2.7 小时,但一般情况还是够用的)。
for
循环命令。
REM 1
@echo off
for %%a in (1, 1, 5) do (
echo %%a
)
pause
执行结果:
1
1
5
以上代码表示,变量 a
在集合 (1, 1, 5)
中进行遍历,然后回显出值。
@echo off
for /l %%a in (1, 1, 5) do (
echo %%a
)
pause
执行结果:
1
2
3
4
5
以上代码表示,变量 a
从 1 开始,步长为 1,终值为 5,进行循环。
两段代码的区别在于,第二段代码在 for 循环开始时,多了 /l
参数。
setlocal
启动批处理文件中环境变量的本地化。通俗地讲,该命令执行后会使得批处理程序对局部变量进行修改,而不是始终保持全局变量的值。如果这里没有看懂的话,请比较以下两段代码就清楚了:
REM 1
@echo off
set /a a=123
if %a% equ 123 (
set /a a=%a%*2
echo %a%
) else (
echo %a% not equal to 123
)
pause
执行结果为:123。
REM 2
@echo off
set /a a=123
setlocal enableDelayedExpansion
if !a! equ 123 (
set /a a=!a!*2
echo !a!
) else (
echo !a! not equal to 123
)
endlocal
pause
执行结果为:246。
执行结果差异的原因在于第 1 段代码没有开启环境变量的本地化,因此在设置变量值后,引用变量时仍然是全局变量的值;使用 setlocal
指令后,解决了这一问题。显然,第 2 段代码是我们预期的结果。
比较这两段代码可以发现,使用 setlocal
主要需要注意以下两点:
- 需要声明
setlocal enableDelayedExpansion
; - 变量引用形式均为
!a!
。
enableextensions
启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disableextensions
禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
enabledelayedexpansion
启用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
disabledelayedexpansion
禁用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。
taskkill
结束某一进程。常用的有以下两种用法:
- 结束已知应用名称的某一进程;
- 结束已知进程码的某一进程。
以关闭 Notepad++.exe 程序为例举些例子:
REM 1
taskkill /im notepad++.exe
REM 2
taskkill /pid 1376 -t -f
进程码可以通过任务管理器查询,或者通过 cmd
运行 tasklist
获取。
参数 -t
表示结束该进程,-f
表示强制结束该进程及所有子进程。
shift
@echo off
: round
if "%1"=="" goto end
echo 1"中文"
type %1
echo .
shift
goto round
: end