关于bat:BAT脚本02-条件-循环

224次阅读

共计 2603 个字符,预计需要花费 7 分钟才能阅读完成。

条件语句

仅 if 状况

if "%choice%"=="R" color c

字符相干判断

if "%TIME:~0,2%" lss "12" (echo 当初是上午) else (echo 当初是下午) 

数值相干判断

set /a num=5 
if %num% equ 5 (echo 变量 num 等于 5) 
if not %num% equ 4 (echo 变量 num 不等于 4) 

以下数值 / 字符均可应用:
== – 等于
EQU – 等于
NEQ – 不等于
LSS – ⼩于
LEQ – ⼩于或等于
GTR – ⼤于
GEQ – ⼤于或等于

否定 NOT

if not %num% == 4 (echo 变量 num 不等于 4) 

存在 exist

if exist "D:\test my folder\a.txt" (del "D:\test my folder\a.txt") else (echo 您所要删除的文件不存在) 

变量定义 defined

对于 if defined 来说,与 if exist 相似,只不过 if defined 的判断对象不是文件,而是变量,它用于判断环境变量是否被定义。

循环语句

文件遍历

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

查看以 [drive:]path 为根的目录树,指向每个目录中的 FOR 语句。如果在 /R 后没有指定目录标准,则应用当前目录。如果集仅为一个单点 (.) 字符,则枚举该目录树。
@echo off
for /r *. %a in (*.txt) do find "bluebear" %a

后果:对当前目录下所有文件(包含子目录外面的文件)进行操作。

@echo off 
setlocal EnableDelayedExpansion 
set /a num=1 
for %%i in (D:\test\*.txt) do ( 
ren "%%i" !num!.txt  => 1. 必须用提早变量 2.!num!.txt 两边带不带双引号成果一样
set /a num+=1 
) 

后果:重命名 D:\test\ 下的所有 txt 文件为:1.txt 2.txt 等。
命令提示符里用 %i,在批处理文件中应应用双百分号 %% 代替单百分比号 %,起因:bat 中 % 为转义字符。

数字遍历

FOR /L %variable IN (start,step,end) DO command [command-parameters]

该集示意以增量模式从开始到完结的一个数字序列。因而,(1,1,5)将产生序列
1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)
@echo off 
setlocal EnableDelayedExpansion 
set var=○ 
for /l %%i in (1,1,7) do set var=%var%!var! 

此时变量 var 曾经变成一行间断的 8 个圆圈了

字符遍历

FOR /F [“options”] %variable IN (file-set) DO command [command-parameters]
FOR /F [“options”] %variable IN (“string”) DO command [command-parameters]
FOR /F [“options”] %variable IN (‘command’) DO command [command-parameters]

fileset 为一个或多个文件名。持续到 fileset 中的下一个文件之前,每份文件都被关上、读取并通过解决。解决包含读取文件,将其分成一行行的文字,而后将每行解析成零或更多的符号。而后用已找到的符号字符串变量值调用 For 循环。以默认形式,/F 通过每个文件的每一行中离开的第一个空白符号。跳过空白行。你可通过指定可选 "options" 参数代替默认解析操作。这个带引号的字符串包含一个
或多个指定不同解析选项的关键字。这些关键字为:

    eol=c           - 指一个行正文字符的结尾(就一个)
    skip=n          - 指在文件开始时疏忽的行数。delims=xxx      - 指分隔符集。这个替换了空格和制表符的
                      默认分隔符集。tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                      的 for 自身。这会导致额定变量名称的调配。m-n
                      格局为一个范畴。通过 nth 符号指定 mth。如果
                      符号字符串中的最初一个字符星号,那么额定的变量将在最初一个符号解析之后
                      调配并承受行的保留文本。usebackq        - 指定新语法已在下类状况中应用:
                      在作为命令执行一个后引号的字符串并且一个单
                      引号字符为文字字符串命令并容许在 file-set
                      中应用双引号扩起文件名称。
  • 文件
@echo off 
echo 测试 文字筛选.txt 里每一行的首单词 
for /f %%i in (文字筛选.txt) do echo %%i 
pause 
@echo off
echo skip=2 示意前两行被跳过 
for /f "skip=2" %%i in (文字筛选.txt) do echo %%i 
pause 
@echo off
echo tokens=2,4-6 示意提取每行的第 2 个、以及第 4 到 6 个单词 
for /f "skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l. 
pause 
@echo off
echo eol=N 示意当此行的首字母为 N 时,就疏忽该行 
for /f "eol=N skip=2 tokens=2,4-6" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l. 
pause 
@echo off
echo delims=e 示意不再以空格辨别每个词,而是以字母 e 作为距离 
for /f "eol=N skip=2 tokens=2,4-6 delims=e" %%i in (文字筛选.txt) do echo %%i, %%j, %%k, %%l. 
pause 
@echo off
echo usebackq 示意双引号里的货色是文件名而不是字符串 
for /f "usebackq eol=N skip=2 tokens=2,4-6 delims=e" %%i in ("文字筛选.txt") do echo %%i, %%j, %%k, %%l. 
pause 
  • 字符串
@echo off
for /f "tokens=1-3" %%i in ("This text is an example") do echo %%i, %%j, %%k
pause 

输入:This, text, is

  • 命令
@echo off
set var=This text is an example
for /f "tokens=1-3" %%i in ('echo %var%') do echo %%i, %%j, %%k
pause 

输入:This, text, is

正文完
 0