文章目录
- bat批处理脚本(框架)
- set变量设置
- 基本语法
- 显示环境变量
- 自定义环境变量
- 临时环境变量和永久环境变量
- 特殊环境变量和系统默认环境变量
- set命令利用选项的其他应用
- !与%解析变量的区别/为什么使用setlocal enabledelayedexpansion
- 区别
- %的规则
- !使用
- %0
- 执行码判断与日志文件记录
- errorlevel的使用
- 循环体
- for 循环使用(扩展)
- goto 命令
- 其他
bat批处理脚本(框架)
@echo of
setlocal enabledelayedexpansionendlocal
set变量设置
基本语法
set [variable=[string]]
variable
是要设置或修改的环境变量的名称,string
是要赋给该环境变量的值,赋值不带空格
显示环境变量
set
– 不带参数
- 它会显示当前所有的环境变量及其值
自定义环境变量
set promm=mmorp
- 后续使用环境变量用到%,如
%promm%
就会将设置的变量进行引用
临时环境变量和永久环境变量
- 临时环境变量:通过
set
命令在命令提示符(CMD)窗口中设置的环境变量是临时的。这意味着当你关闭这个 CMD 窗口后,这些环境变量就会消失。例如,你在一个 CMD 窗口中设置了set tempVar = 123
,这个tempVar
在其他打开的 CMD 窗口中是不可用的,并且当你关闭这个设置它的 CMD 窗口后,它也不再存在。 - 永久环境变量:要设置永久环境变量,需要通过系统的 “环境变量” 设置界面。在 Windows 中,可以通过右键点击 “此电脑”,选择 “属性”,然后在弹出的窗口中点击 “高级系统设置”,在 “系统属性” 对话框的 “高级” 选项卡下,点击 “环境变量” 按钮来打开环境变量设置窗口。在这里,你可以在 “用户变量” 或 “系统变量” 中添加、修改或删除环境变量。这些设置的环境变量会在系统重启后仍然存在,并且对所有用户(如果是系统变量)或者特定用户(如果是用户变量)的程序和操作产生影响。
特殊环境变量和系统默认环境变量
- 系统默认环境变量:Windows 系统自带了许多默认的环境变量,如
SystemRoot
(通常指向 Windows 系统安装目录,例如C:\Windows
)、TEMP
(用于存储临时文件的目录路径)和PATH
(包含了一系列系统和应用程序可执行文件的搜索路径)等。这些环境变量在系统运行和程序调用过程中起着至关重要的作用。例如,PATH
环境变量确保了在命令提示符中输入命令时,系统能够正确地在指定的目录路径中找到对应的可执行文件来执行。 - 特殊环境变量:除了常见的系统默认环境变量,还有一些特殊的环境变量,如
ERRORLEVEL
(用于反映上一个可执行程序或命令执行完毕后返回的错误代码)和DATE
、TIME
(分别用于获取当前日期和时间)等。这些环境变量在批处理脚本和一些特定的程序控制场景中非常有用。例如,利用ERRORLEVEL
可以根据上一个命令的执行结果来决定后续的操作流程,就像在前面提到的if errorlevel
语句一样。
set命令利用选项的其他应用
- /a(算术运算)
- 语法:
set /a [expression]
- 示例:
set /a num=1 + 2
:计算1+2
的结果,并将结果(3
)赋值给变量num
。- 可以使用多种算术运算符,如
+
(加)、-
(减)、*
(乘)、/
(除)、%
(取余)等。例如,set /a remainder=7 % 3
会将1
(7
除以3
的余数)赋值给变量remainder
。 - 当然也可以进行赋值运算,如
set /a count+=1
- 语法:
- /p(用户输入)
- 语法:
set /p variable=[promptString]
- 示例:
set /p name=请输入你的名字:
:命令提示符会显示 “请输入你的名字:”,用户输入的内容将被赋值给变量name
。- 这在需要与用户交互获取信息时非常有用,比如在一个简单的批处理程序中,根据用户输入的文件名来执行相应的操作。
- 语法:
- /d(删除变量)
- 语法:
set /d [variable]
- 示例:
- 假设已经有一个变量
temp
,使用set /d temp
可以删除变量temp
。不过需要注意的是,在实际应用中,这种删除变量的操作要谨慎使用,因为可能会影响到后续批处理程序的运行逻辑。
- 假设已经有一个变量
- 语法:
!与%解析变量的区别/为什么使用setlocal enabledelayedexpansion
区别
%count%
是在运行命令前提前获取变量的值,然后利用拿到的值再进行运行–(变量的扩展)
!count!
是在命令运行时动态获取变量的值,也就是执行的时候再去取值
%的规则
echo %count%
其中%会在命令执行之前对环境变量进行解析,拿到解析之后的值去执行这条命令
比如: count=0 是count一开始的值,那执行echo %count%
会有一个怎样的顺序呢
-
%count%–>0
-
echo 0 这就是变量的扩展
-
%k%
如果变量扩展之前并没有对k进行赋值,那%k%
就会自动被扩展为空格 -
@echo off set k=yyy for /l %%i in (1,1,3) do (set k= %%i ::对k进行循环赋值 echo %k% %%i ) pause
结果:
yyy 1 yyy 2 yyy 3
解释
:当命令识别到for循环体的时候就对%k%进行变量扩展了,同样的在:loop goto loop中也算是在循环体进入前实现扩展。
循环中的命令执行了吗?
解释
:执行了,只不过因为变量的扩展,echo语句中的%k%
直接输出了,并没有输出更新后的%k%
命令
!使用
当使用setlocal enabledelayedexpansion
开启延迟环境变量扩展后,就可以使用!
来正确引用环境变量。
!
进行环境变量的引用可以动态获取变量的值,同一个例子
@echo off
setlocal enabledelayedexpansion
set k=yyy
for /l %%i in (1,1,3) do (set k= %%i
echo !k! %%i
)
endlocal
pause
结果:
1 12 23 3
区别可见
%0
%0
是一个特殊的参数,代表当前脚本(如果是在批处理脚本中)或命令本身的名称。%~nx0
代表着文件名加扩展名的完整文件名。- 在
start cmd%\n0
中执行cdm进程后,会因为%0
的存在,在新开启的cmd窗口中会尝试再次执行此命令(start cmd\n%0
) - 例如:假设这个命令在一个名为
test.bat
的批处理文件中,%0
就是test.bat
。第一次执行start cmd test.bat
会启动一个新的命令提示符窗口并运行test.bat
。在这个新窗口中,同样会执行start cmd test.bat
,再次启动一个新窗口,这样就会一直循环下去,不断地启动新的命令提示符窗口并尝试执行相同的批处理文件。
执行码判断与日志文件记录
errorlevel的使用
-
errorlevel
:这是一个特殊的内置变量,用于反映
上一个可执行程序或命令执行完毕后返回的错误代码。在 Windows 系统中,许多命令和程序在执行结束后都会返回一个错误代码,通常情况下,返回代码为0
表示操作成功执行,而非0
值则表示出现了某种程度的错误,不同的非0
值可能对应不同类型的错误情况。[与其他有些不同,这里返回0表示成功] -
例如:
echo start cmd >scvul.txt if errorlevel 1 (echo [ERROR] Failed to create scvul.txt >> %logFile% ) else (echo [SUCCESS] Created scvul.txt >> %logFile% )
errorlevel
判断echo start cmd >scvul.txt
命令是否执行成功,并引出下面将结果记录入日志的操作。
循环体
for 循环使用(扩展)
-
for /f
循环用于文本处理-
用途:
for /f
循环主要用于处理文本文件或命令输出的文本内容。它可以按行读取文本,并对每行进行处理。 -
语法示例:
for /f "options" %%i in (file.txt) do echo %%i
-
其中
"options"
是可选的参数,用于指定如何处理文本行,如跳过开头的空格、以特定字符作为分隔符等eol
选项用于指定注释行的起始字符,默认是;
,即遇到以;
开头的行就当作注释行跳过。skip=n
可以跳过文件开头的n
行。例如,for /f "skip=2 eol=;" %%i in (file.txt) do echo %%i
会跳过file.txt
文件开头的 2 行,并且不处理以;
开头的行,将其余行的内容赋值给%%i
并输出。delims
选项用于指定每行内容的分隔符。默认分隔符是空格和制表符。例如,for /f "delims=," %%i in (file.txt) do echo %%i
,如果file.txt
中有一行内容是1,2,3
,则会以逗号为分隔符,将1
赋值给%%i
并执行echo %%i
输出1
。tokens
选项用于指定要提取的列(或部分)。例如,for /f "tokens=2 delims=," %%i in (file.txt) do echo %%i
,对于file.txt
中以逗号分隔的内容,会提取第二列的内容赋值给%%i
并输出。 -
file.txt
是要处理的文本文件,循环会逐行读取file.txt
,将每行内容赋值给%%i
,然后执行echo %%i
输出每行内容。例如,如果file.txt
内容为line1
、line2
,则会依次输出line1
和line2
。
-
-
for /r
循环用于目录遍历- 功能:
for /r
循环用于在指定目录及其子目录中遍历文件。 - 语法格式:
for /r [drive:]path %%i in (set) do command [command - parameters]
。例如,for /r C:\Users %%i in (*.txt) do echo %%i
,它会在C:\Users
目录及其子目录中查找所有.txt
文件,将找到的文件路径依次赋值给%%i
,并执行echo %%i
输出文件路径。
- 功能:
-
for /l
循环用于数字序列循环- 特点:
for /l
循环用于生成数字序列并循环。 - 语法示例:
for /l %%i in (start,step,end) do command [command - parameters]
。例如,for /l %%i in (1,1,5) do echo %%i
,这里start = 1
(起始数字),step = 1
(步长),end = 5
(结束数字),循环会从1
开始,每次增加1
,直到5
结束,依次输出1
、2
、3
、4
、5
。
- 特点:
goto 命令
:loop
goto loop 构成循环体,也成为跳转循环
-
当然凭借这个无条件任意跳转也能形成许多死锁
-
如:前面有
start cmd %0
现在有
:loopstart cmdgoto loop
其他
-
在
if
语句中,比较运算符(如<=
)的两边需要有空格。否则,批处理脚本会认为这是一个无效的条件表达式 正确:if %count% <= 3 () -
for /l %%i in (1,1,3) do ()
for /l
是批处理脚本中的一种循环控制语句,用于创建一个数字序列并迭代执行命令。
基本语法
-
FOR /L %%variable IN (start, step, end) DO command [command-parameters]
%%variable
指定一个单一字母变量名,用于在循环中存储当前的数值。start
表示序列的起始值。step
表示每次迭代的步长(增量或减量)。end
表示序列的结束值。当迭代变量超过这个值时,循环结束。DO command [command-parameters]
是要在每次迭代中执行的命令。
- 命令中
""
的作用 (一般不妨碍命令的正确执行)
- 防止空格问题:当设置环境变量的值包含空格时,引号是非常必要的。如果没有引号,Windows 命令处理器可能会误解变量的值。例如,若环境变量的值是一个包含空格的文件路径,如
C:\Program Files\MyApp
,如果写成set logFile = C:\Program Files\MyApp
,命令处理器可能会认为logFile
的值是C:\Program
,而后面的Files\MyApp
会被当作另外的命令或者参数来处理。但如果写成set "logFile = C:\Program Files\MyApp"
,就能够正确地将整个路径赋值给logFile
环境变量。 - 防止特殊字符误解:引号可以防止变量值中的特殊字符被错误解析。在 Windows 命令行中,一些字符(如
&
、|
、>
、<
等)有特殊的用途,它们用于命令连接、管道操作、重定向等。如果变量值中包含这些特殊字符,没有引号可能会导致命令执行出现意外情况。例如,若logFile
的值是file.txt > output.log
(这可能是一个比较奇怪的例子,但用于说明问题),写成set logFile = file.txt > output.log
会使>
被当作输出重定向操作符来处理,而不是作为变量值的一部分。使用引号set "logFile = file.txt > output.log"
可以确保整个字符串被当作变量的值。
>>
追加命令,一般情况下,如果没有特殊处理,echo
命令在使用>>
追加内容时会自动添加一个换行符。
是file.txt > output.log
(这可能是一个比较奇怪的例子,但用于说明问题),写成set logFile = file.txt > output.log
会使>
被当作输出重定向操作符来处理,而不是作为变量值的一部分。使用引号set "logFile = file.txt > output.log"
可以确保整个字符串被当作变量的值。
-
>>
追加命令,一般情况下,如果没有特殊处理,echo
命令在使用>>
追加内容时会自动添加一个换行符。 -
pause
命令执行终止命令,执行pause
后命令就直接停了