批处理(bat文件)一些基础语法,旨在看懂文件,可以稍作修改

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 主要需要注意以下两点:

  1. 需要声明 setlocal enableDelayedExpansion
  2. 变量引用形式均为 !a!

enableextensions

启用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

disableextensions

禁用命令扩展,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

enabledelayedexpansion

启用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

disabledelayedexpansion

禁用变量延迟,直到出现匹配的 endlocal 命令,无论 setlocal 命令之前的设置如何。

taskkill

结束某一进程。常用的有以下两种用法:

  1. 结束已知应用名称的某一进程;
  2. 结束已知进程码的某一进程。

以关闭 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

猜你喜欢

转载自blog.csdn.net/Sun_Raiser/article/details/118712465