bat常规脚本命令(用到才会写,未完待续10/27)

一、rem和::

  • 区别
    1)rem:注释,支持echo回显;
    2):::注释,不支持echo回显,不能在()语句块中使用。
    3)扩展:冒号后紧跟一个非字母数字的一个特殊符号其实都等价于双冒号,目的是使goto无法识别;

  • 例子

@echo on
rem 这是注释内容,由于指定了echo on,命令行会打印这段注释
:: 这也是注释内容,但是不支持回显
@echo off

二、call和start

1)区别

1)call:调用另一个批处理文件,如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令;
2)start:批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令

2)cal使用示例

1)调用脚本

:: 调用另一个脚本,并在执行结束后返回本脚本
:: filename 参数必须具有 .bat 或 .cmd 扩展名
call autoexec.bat 参数1 参数2

2)调用命令行字符串

:: 如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456
set aa=123456
set cmdstr=echo %aa%
call %cmdstr%
pause

3)调用带返回值的子程序
这里重点关注getSum中shift的用法,默认右移1位,即shift等价于shift /1。
以本demo为例:%1在没有右移时表示第一个入参,在shift /1之后,%1指向的是原%2的入参。

@echo off
rem 调用getString子程序
call :getString return
echo return = %return%
pause


@echo off
set sum=0
call :getSum 1 2 3 4 5
echo sum = %sum%
pause
goto :eof


rem 利用入参实现返回值
:getString
set %1=from sub script
goto :eof

rem 利用全局变量实现返回值
:getSum
set /a sum+=%1
shift /1
if not "%1"=="" goto getSum
goto :eof

3)start使用场景

:: 调用文件管理器打开D盘
start explorer d:\
:: 打开命令行窗口
start cmd

三、pause

暂停并运行显示:请按任意键继续. . .
要显示其他提示语,可以这样用:Echo 其他提示语 & pause > nul

四、for循环

1)基本格式

FOR %%variable IN (set) DO command [command-parameters]

2)参数解释

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

3)FOR循环的4个参数 /d /l /r /f

  • /d 搜索目录
    使用格式:FOR /D %%variable IN (set) DO command [command-parameters]
  • 作用:指定遍历范围为当前目录,且遍历对象仅为文件夹不包含文件类型
  • 适用性:如果 set 中包含通配符(* 和 ?),将对与 set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。这个参数主要用于目录搜索,不会搜索文件。
# 打印c盘根目录所有文件夹名称
@echo off
for /d %%i in (c:\*) do echo %%i
pause

# 打印c盘根目录名字只有1-3个字母的文件夹
for /d %%i in (c:\???) echo %%i
pause
  • /l 确定循环次数和步长
使用格式: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)。
  • /r 遍历对象含文件和文件夹
使用格式:FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
作用:指定递归遍历范围为/r后面的路径,遍历对象含文件和文件夹
  • 作用:检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符或则具体的文件名(不含通配符),则忽略set枚举该目录树。
@echo off
:: 递归遍历指定路径
for /r e: %%i in (*.exe) do echo %%i
:: 递归遍历当前路径
for /r %%i in (*.exe) do echo %%i
pause
  • /f 遍历读取文件、字符串、命令行中指定内容执行相应操作
使用格式:
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]

选项参数解释:
其中, [“options”]为一个或多个解析选项,选项之间用空格断开,这些解析选项包括:
1)eol=c - 指一个行注释字符的结尾(就一个)(备注:默认以使用;号为行首字符的为注释行)
2)skip=n - 指在文件开始时忽略的行数,(备注:最小为1,n可以大于文件的总行数,默认为1。)
3)delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
4)tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。m-n格式为一个范围

@echo off
rem 首先建立临时文件test.txt
echo ;注释行,这是临时文件,用完删除 >test.txt
echo 111213141516>>test.txt
echo 21段,22段,23段,24段,25段,26段 >>test.txt
echo 31段-32段-33段-34段-35段-36段 >>test.txt
FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
Pause
Del test.txt

运行显示结果:
11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .

五、tasklist&taskkill进程管理

tasklist|findstr pname
# 指定进程名称   pname就类似test.exe这样的名字
taskkill /f /im pname
# 指定进程ID(可指定多个)
taskkill /f /pid 2152 /pid 1284

猜你喜欢

转载自blog.csdn.net/weixin_43679037/article/details/127547410