bat 批示处理详解-1

一: bat 文件理解

1> 理解

windows下BAT批处理的工作原理就是一次处理多条DOS命令,其效果和在DOS下依次执行各条命令相同;BAT文件其实就是文本文件,用任意文本编辑器均可打开。

windows下借助bat文件,相对于–Linux下借助shell脚本可以完成很多操作步骤繁琐但操作次序相同,且整个过程需要重复执行多次的情况

2> 批处理运行命令机制

批处理读取命令时是按行读取,在处理之前要完成必要的预处理工作;在其中包含该命令中的变量赋值;

应用场景:'交换'两个变量的值,但是'不使用临时'变量
 
set var1=abc
 
set var2=123
 
set var1=%var2%& set var2=%var1%
 
原因:先做'预处理'-->'变量值'替换

错误语法:

set a=123 & echo %a% # 命令是按行读取,此处还未对a做处理,所以此处是有错误的

为了解决这类问题,设置变量延迟
作用:在读取完成一行语句后,不立即对该行的变量进行赋值,而是会对某单条语句执行后,在进行赋值,这也是延迟变量赋值作用;

setlocal enabledelayedexpansion
启动了变量延迟效果:告知'批处理'动态'感知'变化-->即'先不给'该行变量赋值,而是在'运行过程中'给变量'赋值' -->'顺序'

解读:%variable%‘不能感知’变量的’变化’

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,3,10) do (
set a=%%i  # 此处不能使用 %a%
echo !a!
)

pause

二: dos命令整理

1> dos命令 help /commadn /? -查询帮助

cmd界面直接输入---》help  如下命令
常用命令含义
CD显示当前目录的名称或将其更改。
CHDIR显示当前目录的名称或将其更改。
BREAK设置或清除扩展式 CTRL+C 检查。
DATE显示或设置日期
DIR显示一个目录中的文件和子目录
ECHO显示消息,或将命令回显打开或关闭
EXIT退出 CMD.EXE 程序(命令解释程序)
FIND在一个或多个文件中搜索一个文本字符串。
FINDSTR在多个文件中搜索字符串。
HELP提供 Windows 命令的帮助信息。
PATH为可执行文件显示或设置搜索路径。
PAUSE暂停批处理文件的处理并显示消息。
ENDLOCAL结束批文件中环境更改的本地化。
TIME显示或设置系统时间。
CLS清除屏幕
SYSTEMINFO显示计算机的特定属性和配置。
COLOR设置默认控制台前景和背景颜色。
文件或目录命令含义
COPY将至少一个文件复制到另一个位置。
MD创建一个目录。
RD删除目录。
MKDIR创建一个目录。
MKLINK创建符号链接和硬链接
MODE配置系统设备。
MORE逐屏显示输出。
MOVE将一个或多个文件从一个目录移动到另一个目录。
COMP比较两个或两套文件的内容
OPENFILES显示远程用户为了文件共享而打开的文件。
DEL删除至少一个文件。
ERASE删除一个或多个文件。
FC比较两个文件或两个文件集并显示 它们之间的不同。
RECOVER从损坏的或有缺陷的磁盘中恢复可读信息。
REN重命名文件。
RENAME重命名文件。
REPLACE替换文件。
RMDIR删除目录。
ROBOCOPY复制文件和目录树的高级实用工具
dos命令语句含义
CALL从另一个批处理程序调用这一个。
IF在批处理程序中执行有条件的处理操作。
SET显示、设置或删除 Windows 环境变量。
SORT对输入排序。
FOR为一组文件中的每个文件运行一个指定的命令。
GOTO将 Windows 命令解释程序定向到批处理程序中某个带标签的行。
SETLOCAL开始本地化批处理文件中的环境更改。
START启动单独的窗口以运行指定的程序或命令。
TASKLIST显示包括服务在内的所有当前运行的任务。
TASKKILL中止或停止正在运行的进程或应用程序。
TYPE显示文本文件的内容。
PRINT打印一个文本文件。
其他命令含义
TITLE设置 CMD.EXE 会话的窗口标题。
TREE以图形方式显示驱动程序或路径的目录结构。
VER显示 Windows 的版本。
CHCP显示或设置活动代码页数。
CHKDSK检查磁盘并显示状态报告。
ASSOC显示或修改文件扩展名关联。
CHKNTFS显示或修改启动时间磁盘检查。
ATTRIB显示或更改文件属性。
CMD打开另一个 Windows 命令解释程序窗口。
BCDEDIT设置启动数据库中的属性以控制启动加载。
CACLS显示或修改文件的访问控制列表(ACL)。
COMPACT显示或更改 NTFS 分区上文件的压缩。
CONVERT将 FAT 卷转换成 NTFS。你不能转换当前驱动器。
DISKPART显示或配置磁盘分区属性。
DOSKEY编辑命令行、撤回 Windows 命令并创建宏。
DRIVERQUERY显示当前设备驱动程序状态和属性。
FSUTIL显示或配置文件系统属性。
FTYPE显示或修改在文件扩展名关联中使用的文件类型。
FORMAT格式化磁盘,以便用于 Windows。
GPRESULT显示计算机或用户的组策略信息。
GRAFTABL使 Windows 在图形模式下显示扩展字符集。
LABEL创建、更改或删除磁盘的卷标。
ICACLS显示、修改、备份或还原文件和目录的 ACL。
POPD还原通过 PUSHD 保存的当前目录的上一个值。
SCHTASKS安排在一台计算机上运行命令和程序。
SHIFT调整批处理文件中可替换参数的位置。
SHUTDOWN允许通过本地或远程方式正确关闭计算机。
PROMPT更改 Windows 命令提示。
PUSHD保存当前目录,然后对其进行更改。
SC显示或配置服务(后台进程)。
SUBST将路径与驱动器号关联。
VERIFY告诉 Windows 是否进行验证,以确保文件正确写入磁盘。
VOL显示磁盘卷标和序列号。
XCOPY复制文件和目录树。
WMIC在交互式命令 shell 中显示 WMI 信息。
REM记录批处理文件或 CONFIG.SYS 中的注释(批注)。

2> dos命令使用查询

dos_command -help(-h)

1. 传参命令–COLOR -H

设置默认的控制台前景和背景颜色。

COLOR [attr]

  attr        指定控制台输出的颜色属性。

颜色属性由两个十六进制数字指定 -- 第一个
对应于背景,第二个对应于前景。每个数字
可以为以下任何值:

    0 = 黑色       8 = 灰色
    1 = 蓝色       9 = 淡蓝色
    2 = 绿色       A = 淡绿色
    3 = 浅绿色     B = 淡浅绿色
    4 = 红色       C = 淡红色
    5 = 紫色       D = 淡紫色
    6 = 黄色       E = 淡黄色
    7 = 白色       F = 亮白色

如果没有给定任何参数,此命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台
窗口、/T 命令行开关或 DefaultColor 注册表
值。

如果尝试使用相同的
前景和背景颜色来执行
 COLOR 命令,COLOR 命令会将 ERRORLEVEL 设置为 1。

示例: "COLOR fc" 在亮白色上产生淡红色

DEMO

COLOR 72#  背景7 = 白色, 字体 2 = 绿色

在这里插入图片描述

2. 查询指令 SYSTEMINFO

C:\Users\CHH_PC>SYSTEMINFO
主机名:           DESKTOP-T164P4E
OS 名称:          Microsoft Windows 10 专业版
OS 版本:          10.0.19044 暂缺 Build 19044
OS 制造商:        Microsoft Corporation
OS 配置:          独立工作站
OS 构建类型:      Multiprocessor Free
注册的所有人:     CHH_PC
注册的组织:       暂缺
产品 ID:          00331-20020-00000-AA583
初始安装日期:     2022/4/15, 20:25:43
系统启动时间:     2022/6/25, 0:02:32
系统制造商:       Dell Inc.
系统型号:         Inspiron 7472
系统类型:         x64-based PC
处理器:           安装了 1 个处理器。
                  [01]: Intel64 Family 6 Model 142 Stepping 10 GenuineIntel ~1600 Mhz

3. DOS窗口的编码格式

936 是微软为中国区设置的编码格式,当然,我们也可以对编码格式进行修改
chcp 编码格式代码 
#这种只是临时的进行修改当前文件的编码格式,当这个DOS窗口关闭后又将恢复到原来的编码格式
代码编码格式
950繁体中文
65001UTF-8
936简体中文默认的GBK
437MS-DOS 美国英语
1253希腊语
1258越南语
1256阿拉伯语

三: bat 语法介绍

1> 辅助命令

1. 符号&转义&组合

符号-“”、%、:, ; () !

:冒号
** : : 开头为单个冒号;被视作标号,而直接忽略后面所有的内容;
有效标号: 冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别;
无效标号:冒号后紧跟一个非字母数字开头的字符串,goto语句无法识别;可以起到注释左右;即作为习惯 ** :: ** 常被用做注释符号,其实后面一个 ** : ** 可以替换成任意字符也能起到注释效果,如:
:+** 、 :* …
REM:‘注释命令’,一般用来给程序’加上注解’,该命令后的内容’不被执行, 但’能回显;
%注释内容% :用于行内注释,极少用,慎用;

注释区别
::不可回显,被视作无效命令
REM或rem不被执行,能回显,可用于config.sys文件

“”: 双引号: 允许在字符串中出现空格;
%:百分号

涉及:%、%%vaeiable-->"for循环中(接受变量)"、%variable%-->"echo中引用变量"
 
备注:!variable! -->是对'%variable%'的增强

符号功能
%批处理变量引导符号
%var%引用变量
%0、—%90为批量本身,1-9为传参;例如:copy %0 /sys/
行内注释%注释内容%-但不能出现重定向等符号

, 逗号
逗号相当于空格,在某些情况下“,”可以用来当做空格使
dir,c:\ 或者传参 12,23

; 分号
分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
dir c:\;d:\;e:\;z:\ 等同于
dir c:\
dir d:\ …
() 括号
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用;
demo

命令:echo 1 echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)

! 感叹号
在变量延迟问题中,用来表示变量,即%var%应该表示为!var!

转义\换行
符号功能
^开头对特殊符号’<、>、&'的前导字符,在命令中他将’以上3个符号’的’特殊’功能去掉,仅仅只把他们’当成符号’而’不使用’他们的特殊意义
^末尾在语句末尾起到换行作用
组合

&、&&、||:把多条命令组合起来成一条命令执行
语法: 第一条命令 & 第二条命令 & 第三条命令 [&…]

符号功能
&把多条命令顺序执行,中间有语句错误,不影响下一句语句执行,无条件执行&符号后面的命令
&&当&&前面的命令成功执行时,执行&&后面的命令,否则不执行
双管道符当前面的命令失败时,执行符号后面的命令,否则不执行

优先级别

'|' 大于 '>、>>' 大于 '||、&&'
# 管道命令优先高于重定向命令,重定向命令优先高于组合命令;

2. echo 回显

备注: echo 后面的字符串’不需要加’双引号–>否则也会’写入文件’中 -->区别Linux
关闭回显:是指’运行批处理文件’时,‘不显示’文件里的’每条命令’,只显示’运行结果’;
@echo off #从’本行开始’关闭回显 ----一般批处理’第一行’都是这个

C:\Users\CHH_PC>echo /?
显示消息,或者启用或关闭命令回显。

  ECHO [ON | OFF]
  ECHO [message]

若要显示当前回显设置,请键入不带参数的 ECHO。
==========================================
echo off  :显示执行的路径,不显示执行命令,直接显示内容
echo on:显示执行的路径,显示执行命令并显示内容,
@echo off : 不显示执行的路径,不显示执行命令,直接显示内容

用法:
A:echo 配合@ \off\on 关闭打开回显
B:echo 后面跟空格加字符,回显字符串信息作用;
C: echo紧跟 .|,管道符后可以跟命令用来回显;

C:\Users\CHH_PC>echo.|time
当前时间: 22:35:19.42
输入新时间:

bat内容

@echo off
echo.|SYSTEMINFO	
pause

D: echo 生成文件并写入信息;

echo a test file. >1.txt # 此处生成文件并写入内容,且a test file.  后有个空格;
echo a test file.>1.txt# 此处生成文件并写入内容,且a test file.  后无空格;因为 **file.>1** ,连接处无空格;
echo a test file.>>1.txt# 此处生成文件并写入内容或者对文件内容后面追加内容;

E:echo 使电脑发出声音用来提示;

声音命令
蜂鸣echo pause>nul

3. pause

运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue…的提示,等待用户按任意键后继续;

4. 句柄

句柄:代码中智能指针;

内容含义
‘>&’将一个句柄内容输出写入到另一个句柄输入
'<& ’将一个句柄读取输入写入到另一个句柄输出中
常用句柄含义
总述常用句柄定义0,1,2,其中3-9未定;stdin可以被<重定向,stdout可以被 > ,>> 重定向;
1>nul禁止输出正确信息;1,2代表某数据流入流出的地址,
2>nul禁止输出错误信息;1,2代表某数据流入流出的地址,
0标准输入stdin,键盘输入
1标准输出stdout,输出到命令提示符窗口conole
2标准错误输出stderr,输出到命令提示符窗口conole

2> 文件处理命令

1. 文件处理

ren 重命名
ren 1.png 2.png # first_file   target_file
move 移动
move file_pat target_path
del 删除
删除一个或多个文件。

DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names
ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names

  names         指定一个或多个文件或者目录列表。
                通配符可用来删除多个文件。
                如果指定了一个目录,该目录中的所
                有文件都会被删除。

  /P            删除每一个文件之前提示确认。
  /F            强制删除只读文件。
  /S            删除所有子目录中的指定的文件。
  /Q            安静模式。删除全局通配符时,不要求确认
  /A            根据属性选择要删除的文件
  属性          R  只读文件            S  系统文件
                H  隐藏文件            A  准备存档的文件
                I  无内容索引文件      L  重新分析点
                O  脱机文件            -  表示“否”的前缀

如果命令扩展被启用,DEL 和 ERASE 更改如下:

/S 开关的显示句法会颠倒,即只显示已经
删除的文件,而不显示找不到的文件。

2. 文件调用及区别call&start& goto

直接调用,在文本中直接调用文件名;例如:@echo off 2.png ,可以直接打开图片
call 调用另一个批处理文件或可执行程序

语法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
参数: [Drive:][Path] FileName 指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。

start 调用;调用外部程序,所有的 DOS命令 和 命令行程序 都可以由 start命令 来调用

常用参数:
MIN :开始时窗口最小化
SEPARATE :在分开的空间内开始 16 位 Windows 程序
HIGH: 在 HIGH 优先级类别开始应用程序
REALTIME :在 REALTIME 优先级类别开始应用程序
WAIT :启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数

================================
Sample:start /MIN test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)

goto label: —:label
区别:其中主要是直接调用与call区别,其他只是跳转

命令区别
直接调用可以调用别的批处理文件,但是这样调用的批处理文件执行结束后不会回到原来的批处理文件
call调用另一个批处理文件或可执行程序,并不终止原来的文件;主要来进行批处理的内部调用,当然也可以调用可执行程序,
start可以调用别的批处理文件 &文件&可执行文件;执行结束后不会回到原来的批处理文件;而start 不能进行内部调用,但是其可以执行几乎所有的外部程序。call 是在当前窗体进行调用一个子进程,变量可以互通,但是start 调用外部程序是相当于是新开一个进程。call 可以将参数传入子进程,子进程也可以将值返回,但是start 只能进行传参,但是不能返回参数或者变量
goto其后可以直接调用,但主要运用在循环中的跳转;goto label: 跳转到指定标签行,然后从" : label " 的下一行开始处理命令 ,goto 语句经常和 if 连起来用label 的名字可以随意取,goto 是根据 " : " 找到该标签的,不要忘记了 冒号。

demo

@echo off

echo goto
goto test1:
:test1  # 直接跳转在这里,可以放在循环中跳转
start test1.bat
pause

3> 执行语句命令

1. if else& if& if exist

if 表示将判断是否符合规定的条件,从而决定执行不同的命令;
语法:
DOS命令里并没有 != 这种写法,但是提供了 not 关键词,也是条件取反的意思

if 条件(成立时执行的命令) else (不成立时执行的命令)
::执行的语句建议都写在 "()" 里。 
当else换行时候;if 语句的末尾使用 " ^ " 符号将语句进行连接,否则会报错

if 条件(成立时执行的命令)^
 else (不成立时执行的命令)
 

demo

@echo off
if exist test1.bat (test1.bat)^
else (echo "the file not exist")
::当存在second.bat 时就执行这个批处理文件 否则打印"the file not exist"
pause
这里是可执行文件在同级目录下,可以添加相对路径也可以放对决路径;
test1.bat 等文件可以被执行,2.png 像图片之类的可以被直接打开;

如果是多个条件,建议适当使用括号把各条件包起来;

 if 1 == 0 ( echo comment1 ) else if 1==0 ( echo comment2 ) else (echo comment3 )

2. if errorlevel number

执行返回值 ,返回的是数字;一般DOS程序会在执行结束后返回一个数字来代表程序运行的结果,称为错误码 errorlevel 或者返回码,有点返回值那味了是不
常见的返回码为 : 0 1

errorlevel 0 成功 errorlevel 1 失败

@echo off
if exist 2.png (2.png)^
else (echo "the file not exist")
::当存在second.bat 时就执行这个批处理文件 否则打印"the file not exist"
if errorlevel 0 (echo operate sucess) else (echo not sucess)
pause
=====================
operate sucess
请按任意键继续. . .

3. for 循环

for 命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令;

基本命令:
FOR %%variable IN (set) DO command [command-parameters]
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令

参数含义
%%variable指定一个单一字母可替换的参数。
(set)指定一个或一组文件。可以使用通配符。
command指定对每个文件执行的命令。
command-parameters为特定命令指定参数或命令行开关。

参数: FOR有4个参数 /d /l /r /f

参数含义
/l含开关/L的for语句,可以根据set里面的设置进行循环,从而实现对循环次数的直接控制
/d表示仅为目录 , 它只能显示当前目录下的目录名字;如果集里面包含通配符,则指定与目录名匹配,而不与文件名匹配
/r/R参数之后还可带盘符及路径;
/f含开关/F的for语句具有最强大的功能,它能够对字符串进行操作,也能够对命令的返回值进行操作,还可以访问硬盘上的ASCII码文件,比如txt文档等
/L

命令:
FOR /L %%variable IN (start,step,end) DO command
其中,start为开始计数的初始值,step为每次递增的值,end为结束值。当end小于start时,step需要设置为负数

for /L %%i in (0,5,100) do (echo %%i& md %%i& mkdir %%i\test)
==============================
循环从0,递增5,直至到达100;同时显示数字,新建文件夹并且在文件夹下新建test文件

求和

@echo off
                                      
set /a sum=0
for /l %%i in (1,1,100) do set /a sum=sum+%%i
echo %sum%
pause
================================
5050
请按任意键继续. . .
/d

命令:
FOR /D %variable IN (set) DO command [command-parameters]

@echo off

echo  %cd%  "current directory path"                                       
d:
for /D %%a in (*A*) do echo %%a   >> %~dp0\wordin_dirname.txt    

pause
如果这里不切换到,D盘的话,/d只闲显示脚本路径下的文件下信息,写到txt文件中;
/r

FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
/r 后无路径:对脚本所在路径遍历
/r 后跟路径:对跟的指定路径遍历
含开关/R的命令有时候被用于通过遍历文件夹来查找某一个文件或文件夹

@echo off

echo  %cd%  "current directory path"                                       
path=d:
for /r %path%  %%i in (*.txt) do echo %%i >>  %~dp0\file_endswith.txt     
pause
==============================
指定path 下的 以.txt 结尾的文件 追加写在   脚本路径下file_endswith.txt      文件中;
D:\FilesPath3.txt       
D:\360\360Safe\deepscan\QVM\model_360nb\update.txt       
D:\360RecycleBin\!此文件夹为使用360清理后的垃圾备份文件.txt       
D:\360RecycleBin\1\1738c7987314ed4166ffc1383a0e4f59.txt       
D:\360RecycleBin\1\f006782cc4d3ebd69dda70eef55d39d0.txt       
D:\360RecycleBin\104\7119dfac6242b7776fdd80dd7e0cd986.txt   
........
/F

命令:
FOR /F [“options”] %%variable IN (set) DO command
其中,set为(“string”、‘command’、file-set)中的一个;options是(eol=c、skip=n、delims=xxx、tokens=x,y,m-n、usebackq)中的一个或多个的组合。一般情况下,使用较多的是skip、tokens、delims三个选项;

选项含义
skip=n从文本开始忽略n行
delims指定定界符
tokens提取列。 通俗讲,共同提取每一行的第m小节的内容。因此,可以用该命令来指定提取文本信息。

tokens 讲解

tokens组合含义
tokens=提取全部。
tokens=m提取第m列。
tokens=m,n提取第m列和第n列。
tokens=m-n提取第m列至第n列。
tokens=*删除每行前面的空格。忽略行首的所有空格。
tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。
tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。

输出变量的个数由定义了的tokens决定。

demo
对日志符号替换

@echo off
Date                             
For /f "tokens=1-3 delims=-/. " %%j In ('Date /T') do echo %%j year %%k month %%l day
pause
===============================
#把1到3列 "/” 替换成 对应的
当前日期: 2022/07/17 周日
输入新日期: (年月日)
2022 year 07 month 17 day
请按任意键继续. . .

显示文档信息

for /f "delims=" %%a in (FilesPath3.txt) do echo.%%a # 显示文档内所有行信息;
for /f "delims=  skip=12"    %%a in (FilesPath3.txt) do echo.%%a# 从第12行开始显示

4. continue 和 break

利用 goto 实现程序中常用的 continue 和 break 命令
ontinue: 在 for 循环的最后一行写上一个标签,跳转到这位置即可

break: 在 for 循环的外面的下一句写上一个标签,跳转到这位置即可
demo

for /F ["options"] %variable IN (command) DO (

... do command ...

if ... goto continue

if ... goto break

... do command ...

:continue

)

:break


4> 其他相关常用命令

1. 路径相关

功能命令区别
当前盘符%~d0
当前路径%cd%表示执行命令时所在的目录;可以改变的,因为它表示的是当前目录,如果在批处理中使用了cd命令就会改变他的值
当前执行命令行%0
当前bat文件路径%~dp0表示批处理文件所在的目录;是在执行某个批处理结束之前是不会改变的,因为代表的是脚本文件在磁盘的位置
当前bat文件短路径%~dp0

demo


echo      %~d0
echo      %cd%
echo       %0
echo     %~dp0
echo    %~dp0
cd /d %~dp0
pause
===================
C:                                                    当前盘符
C:\Users\CHH_PC\Desktop\test                          当前路径
"C:\Users\CHH_PC\Desktop\test\test.bat"               当前执行命令行
C:\Users\CHH_PC\Desktop\test\                         当前bat文件路径
C:\Users\CHH_PC\Desktop\test\						 当前bat文件短路径
请按任意键继续.

查询上级目录可以 cd 再看 %~dp0 信息,这些都会与dir 等命令配合使用;


@echo off
cd /d %~dp0
::显示当前路径
echo %cd%
cd ..
::显示上级目录路径
echo %cd%
pause

2. 传参相关

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。

变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用 %1 到 %9 顺序表示。

Sample:

call test2.bat “hello” “haha” (执行同目录下的“test2.bat”文件,并输入两个参数)

在“test2.bat”文件里写:

echo %1 (打印: “hello”)

echo %2 (打印: “haha”)

echo %0 (打印: test2.bat)

echo %19 (打印: "hello"9)

3,字符串处理

A: 分割

%源字符串:~起始值,截取长度% (起始值从0开始;截取长度是可选的,如果省略逗号和截取长度,将会从起始值截取到结尾;

截取长度如果是负数,表示截取到倒数第几个。)

“%time%” 显示如:“11:04:23.03” (完整的时间"hh:mm:ss.tt")

“%time:~0,5%” 显示"hh:mm"(即"11:04"),其中0表示从右向左移位操作的个数,5表示从左向右移位操作的个数

“%time:~0,8%” 显示标准时间格式"hh:mm:ss"(即"11:04:23",前8个字符串)

"%time:~3,-3%“显示"mm:ss”(即从第4个开始,截去最后3个的字符串)

“%time:~3%” 显示"04:23.03"(即去掉前4个字符串)

“%time:~-3%” 显示".tt"(即最后3个字符串)

上面的字串分割格式,也可以用于其它地方,如目录路径:“%cd:~0,10%”

@echo off
echo %cd%
echo %cd:~0,5%   
echo %cd:~0,8%     
echo %cd:~3,-3%   
echo %cd:~3% 
echo %cd:~-3%                     
pause
=============
C:\Users\CHH_PC\Desktop\test
C:\Us
C:\Users
Users\CHH_PC\Desktop\t
Users\CHH_PC\Desktop\test
est
请按任意键继续. . .
B: 替换
@echo off
set a="C:\Users\CHH_PC\Desktop\test"
set path1=%a:\=&%   
echo %path1%        
pause
==================== # 替换\ 为& 符号
"C:&Users&CHH_PC&Desktop&test"
请按任意键继续. . .
C:拼接

由于没有直接的字符串合并函数,只能用笨方法

@echo off
set a=C:\Userst
set b=\CHH_PC\
set c=Desktop\
set d=test
set str1=%a%%b%%c%%d%   
echo %str1%     
pause
============
C:\Userst\CHH_PC\Desktop\test
请按任意键继续. . .
D: 计算长度

没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度;

@echo off
setlocal enabledelayedexpansion
if exist report.txt del report.txt
set line=0
for /f "tokens=* delims=" %%a in (new.txt) do (
set var=%%a
set /a line+=1
set num=0
call :loop
echo  !line!  >> report.txt
)
:loop
if not "!var!"=="" (
set /a num+=1 
set var=!var:~1!
goto loop
) else (
goto :eof
)
pause
=======================
 1  
.
.
. 
 15  
E: 截取字符,传递参数
@echo off
set ifo=abcdefghijklmnopqrstuvwxyz0123456789
echo %ifo%
echo ==============================
echo first 5 char
echo %ifo:~0,5%
echo lastest  5 char
echo %ifo:~-5%
echo from first to lastest 5 char
echo %ifo:~0,-5%
echo from fourth  ,long 5 
echo %ifo:~3,5%
echo from start at lastest 14 char ,long 5 
echo %ifo:~-14,5%
pause
==========================


abcdefghijklmnopqrstuvwxyz0123456789
==============================
first 5 char
abcde
lastest  5 char
56789
from first to lastest 5 char
abcdefghijklmnopqrstuvwxyz01234
from fourth  ,long 5
defgh
from start at lastest 14 char ,long 5
wxyz0
请按任意键继续. . .

4. set 命令

A: set 赋值

等号两边不要有空格
变量值包含特殊字符需用双引号
避免使用系统环境变量同名的自定义变量;如:path , date , errorlevel 等
语法可行但不推荐使用,set /a x=y=100;set /a x=1,y=2

@echo off
set str=%cd%
echo %str%
set "str1=Bat&Home"
echo " %str1%"
pause
===================
C:\Users\CHH_PC\Desktop\test
" Bat&Home"
请按任意键继续. . .
B: set /p 读取输入

交互获取用户输入
读取文件的内容

@echo off
set /p input=请输入一个字符串:
echo %input%
pause
============
@echo off
set /p input=<"new.txt"
echo %input%
pause

输出是否回车

@echo off
for %%i in (aas aa  zx aasc) do (
set /p =%%i
)
pause
================
aas
aa
zx
aasc
请按任意键继续. . .
@echo off
for %%i in (aas aa  zx aasc) do (
set /p =%%i<nul
)
pause
================
aasaazxaasc请按任意键继续. .
C: set /a 数学运算

等号右侧的变量可以省略百分号

@echo off
set x=99
set y=100
set /a n=%x%+%y% # 等价set /a n=x+y
echo %n%
pause
======================
199
请按任意键继续. .

八进制和十六进制转换成十进制

@echo off
set /a m=012
set /a n=0xA
echo %m% %n%
pause
==============
10 10
请按任意键继续. . .

BAT文件里面进行“取余”操作的时候需要使用两个百分号

@echo off
set /a m=10%%3
echo %m% 
pause
=================
1
请按任意键继续. . .

逻辑运算的特殊字符需要使用双引号

@echo off
set /a "m=1<<10"
set /a n=1"<<"10
echo %m% %n%
pause

不支持直接计算超大数(例如磁盘空间的计算)
不支持直接计算浮点数

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:

表达含义
()分组
! ~ -一元运算符
“* / %”算数运算符
“+ -”算数运算符
<< >>二进制逻辑移位
-二进制按位“与”
^二进制按位“异”
I二进制按位“或”
= *= /= %= += -=算数赋值
= ^== <<= >>=
,表达式分隔符
D: set 字符截取& 替换
set str=字符串 ,其方法和上面截取字符,传递参数 一致
E: set 赋值变量
F: set 字符开头变量

直接执行 set 命令可以显示系统环境变量
命令 set xxx 可以显示所有以 xxx 开头的变量
显示结果按照变量名进行排序


@echo off
set xxx1=A
set xxx3=C
set xxx2=B
set xxx
echo xxx
pause
==================
xxx1=A
xxx2=B
xxx3=C
xxx
请按任意键继续. .

@echo off
for %%i in (a b c d e f g ) do (
set #%%i=%%i
)
for /f "tokens=2 delims==" %%i in ('set #') do (
echo %%i
)
pause
======================
a
b
c
d
e
f
g
请按任意键继续. .

5. ping 命令

用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
            [-r count] [-s count] [[-j host-list] | [-k host-list]]
            [-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
            [-4] [-6] target_name

选项:
    -t             Ping 指定的主机,直到停止。
                   若要查看统计信息并继续操作,请键入 Ctrl+Break;
                   若要停止,请键入 Ctrl+C。
    -a             将地址解析为主机名。
    -n count       要发送的回显请求数。
    -l size        发送缓冲区大小。
    -f             在数据包中设置“不分段”标记(仅适用于 IPv4)。
    -i TTL         生存时间。
    -v TOS         服务类型(仅适用于 IPv4。该设置已被弃用,
                   对 IP 标头中的服务类型字段没有任何
                   影响)。
    -r count       记录计数跃点的路由(仅适用于 IPv4)。
    -s count       计数跃点的时间戳(仅适用于 IPv4)。
    -j host-list   与主机列表一起使用的松散源路由(仅适用于 IPv4)。
    -k host-list    与主机列表一起使用的严格源路由(仅适用于 IPv4)。
    -w timeout     等待每次回复的超时时间(毫秒)。
    -R             同样使用路由标头测试反向路由(仅适用于 IPv6)。
                   根据 RFC 5095,已弃用此路由标头。
                   如果使用此标头,某些系统可能丢弃
                   回显请求。
    -S srcaddr     要使用的源地址。
    -c compartment 路由隔离舱标识符。
    -p             Ping Hyper-V 网络虚拟化提供程序地址。
    -4             强制使用 IPv4。
    -6             强制使用 IPv6。

demo

ping 192.168.16.108 -4 -t
=========================
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.16.108 的回复: 字节=32 时间<1ms TTL=64

192.168.16.108 的 Ping 统计信息:
    数据包: 已发送 = 6,已接收 = 6,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
Control-C

6. shutdown命令

用法: shutdown [/i | /l | /s | /sg | /r | /g | /a | /p | /h | /e | /o] [/hybrid] [/soft] [/fw] [/f]
    [/m \\computer][/t xxx][/d [p|u:]xx:yy [/c "comment"]]
    ===============================
    /?         显示帮助。这与不键入任何选项是一样的。
/i         显示图形用户界面(GUI)。
           这必须是第一个选项。
/l         注销。这不能与 /m 或 /d 选项一起使用。
/s         关闭计算机。
/sg        关闭计算机。在下一次启动时,如果启用了
           自动重启登录,则将自动登录并锁定上次交互
           登录后,重启任何已注册的应用程序。
/r         完全关闭并重启计算机。
/g         完全关闭并重启计算机。重新启动系统后,
           如果启用了自动重启登录,则将自动登录并
           锁定上次交互用户。
           登录后,重启任何已注册的应用程序。
/a         中止系统关闭。
           这只能在超时期间使用。
           与 /fw 结合使用,以清除任何未完成的至固
/p         关闭本地计算机,没有超时或警告。
           可以与 /d 和 /f 选项一起使用。
/h         休眠本地计算机。
           可以与 /f 选项一起使用。
/hybrid    执行计算机关闭并进行准备以快速启动。
           必须与 /s 选项一起使用。
/fw        与关闭选项结合使用,使下次启动转到
           固件用户界面。
/e         记录计算机意外关闭的原因。
/o         转到高级启动选项菜单并重新启动计算机。
           必须与 /r 选项一起使用。
/m \\computer 指定目标计算机。
/t xxx     将关闭前的超时时间设置为 xxx 秒。
           有效范围是 0-315360000 (10 年),默认值为
           如果超时期限大于 0,则 /f 参数为
           /f 参数。
/c "comment" 注释重启或关闭的原因。
           最多允许 512 个字符。
/f         强制关闭正在运行的应用程序而不事先警告用
           当大于 0 的值为
,隐含 /f 参数               则默示为 /f 参数。
/d [p|u:]xx:yy  提供重新启动或关闭的原因。
           p 指示重启或关闭是计划内的。
           u 指示原因是用户定义的。
           如果未指定 p 和 u,则
启动或关闭               是计划外的。
           xx 是主要原因编号(小于 256 的正整数)。
           yy 是次要原因编号(小于 65536 的正整数)。

7. choice 命令

choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的 errorlevel,

然后配合 if errorlevel 选择运行不同的命令。

注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。

choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。

使用时应该加/c:参数,c:后应写提示可输入的字符,之间无空格。它的返回码为1234……

Sample: choice /c:dme defrag,mem,end

将显示: defrag,mem,end[D,M,E]?

Sample:

choice /c:dme defrag,mem,end

if errorlevel 3 goto defrag (应先判断数值最高的错误码)

if errorlevel 2 goto mem

if errotlevel 1 goto end

四:题外话

1> call 文件的相互传参

test.bat

@echo off
setlocal enabledelayedexpansion
set  x=%1%
set  y=%2%
set /a M=%x%+%y%
echo %M%
echo call test1.bat %M%
call test1.bat %M%
pause

test1.bat

@echo off 
set input=%1%
echo  it is test running  number %input%!
pause
输出:
C:\Users\CHH_PC\Desktop\test>test.bat 1,2
3
call test1.bat 3
 it is test running  number 3
请按任意键继续. . .
请按任意键继续. .

2> setlocal enabledelayedexpansion 含义

设置本地为延迟扩展。其实也就是:延迟变量,全称"延迟环境变量扩展",
在cmd执行命令前会对脚本进行预处理,其中有一个过程是变量识别过程,在这个过程中,如果有两个%括起来的如%value%类似这样的变量,就会对其进行识别,并且查找这个变量对应的值,再而将值替换掉这个变量,这个替换值的过程,就叫做变量扩展,然后再执行命令。

3> bat 批示处理详解-2

https://blog.csdn.net/weixin_42914706/article/details/125961200

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

45度看我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值