bat批量处理脚本细节研究

文章目录

    • 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(用于反映上一个可执行程序或命令执行完毕后返回的错误代码)和DATETIME(分别用于获取当前日期和时间)等。这些环境变量在批处理脚本和一些特定的程序控制场景中非常有用。例如,利用ERRORLEVEL可以根据上一个命令的执行结果来决定后续的操作流程,就像在前面提到的if errorlevel语句一样。
    在这里插入图片描述

set命令利用选项的其他应用

  1. /a(算术运算)
    • 语法:set /a [expression]
    • 示例:
      • set /a num=1 + 2:计算1+2的结果,并将结果(3)赋值给变量num
      • 可以使用多种算术运算符,如+(加)、-(减)、*(乘)、/(除)、%(取余)等。例如,set /a remainder=7 % 3会将17除以3的余数)赋值给变量remainder
      • 当然也可以进行赋值运算,如set /a count+=1
  2. /p(用户输入)
    • 语法:set /p variable=[promptString]
    • 示例:
      • set /p name=请输入你的名字::命令提示符会显示 “请输入你的名字:”,用户输入的内容将被赋值给变量name
      • 这在需要与用户交互获取信息时非常有用,比如在一个简单的批处理程序中,根据用户输入的文件名来执行相应的操作。
  3. /d(删除变量)
    • 语法:set /d [variable]
    • 示例:
      • 假设已经有一个变量temp,使用set /d temp可以删除变量temp。不过需要注意的是,在实际应用中,这种删除变量的操作要谨慎使用,因为可能会影响到后续批处理程序的运行逻辑。

!与%解析变量的区别/为什么使用setlocal enabledelayedexpansion

区别

%count%是在运行命令前提前获取变量的值,然后利用拿到的值再进行运行–(变量的扩展)

!count!是在命令运行时动态获取变量的值,也就是执行的时候再去取值

%的规则

  • echo %count% 其中%会在命令执行之前对环境变量进行解析,拿到解析之后的值去执行这条命令

比如: count=0 是count一开始的值,那执行echo %count%会有一个怎样的顺序呢

  1. %count%–>0

  2. 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 循环使用(扩展)

  1. 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内容为line1line2,则会依次输出line1line2

  2. 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输出文件路径。
  3. 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结束,依次输出12345

goto 命令

:loop

goto loop 构成循环体,也成为跳转循环

  • 当然凭借这个无条件任意跳转也能形成许多死锁

  • 如:前面有

    start cmd
    %0
    

    现在有

    :loopstart cmdgoto loop
    

其他

  1. if 语句中,比较运算符(如 <=)的两边需要有空格。否则,批处理脚本会认为这是一个无效的条件表达式 正确:if %count% <= 3 ()

  2. 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] 是要在每次迭代中执行的命令。
  1. 命令中""的作用 (一般不妨碍命令的正确执行)
  • 防止空格问题:当设置环境变量的值包含空格时,引号是非常必要的。如果没有引号,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"可以确保整个字符串被当作变量的值。
  1. >>追加命令,一般情况下,如果没有特殊处理,echo命令在使用>>追加内容时会自动添加一个换行符。

file.txt > output.log(这可能是一个比较奇怪的例子,但用于说明问题),写成set logFile = file.txt > output.log会使>被当作输出重定向操作符来处理,而不是作为变量值的一部分。使用引号set "logFile = file.txt > output.log"可以确保整个字符串被当作变量的值。

  1. >>追加命令,一般情况下,如果没有特殊处理,echo命令在使用>>追加内容时会自动添加一个换行符。

  2. pause命令执行终止命令,执行pause后命令就直接停了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/466179.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ReactPress系列—Next.js 的动态路由使用介绍

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;感谢Star。 Next.js 的动态路由使用介绍 Next.js 是一个流行的 React 框架&#xff0c;支持服务端渲染、静态站点生成和动态路由等功能&#xff0c;极大地简化…

计算机的发展史

计算机的发展史是一个跨越多个世纪的过程&#xff0c;从最早的机械计算设备到如今的高性能、智能化计算机。以下是计算机发展史的简要概述&#xff0c;按重要的技术进步和里程碑进行归类&#xff1a; 1. 早期的计算工具&#xff08;公元前3000年—17世纪&#xff09; 计算机的…

基于STM32的实时时钟(RTC)教学

引言 实时时钟&#xff08;RTC&#xff09;是微控制器中的一种重要功能&#xff0c;能够持续跟踪当前时间和日期。在许多应用中&#xff0c;RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能&#xff0c;通过示例代码实现当前时间的读取和显示。 环…

Python | Leetcode Python题解之第537题复数乘法

题目&#xff1a; 题解&#xff1a; class Solution:def complexNumberMultiply(self, num1: str, num2: str) -> str:real1, imag1 map(int, num1[:-1].split())real2, imag2 map(int, num2[:-1].split())return f{real1 * real2 - imag1 * imag2}{real1 * imag2 imag1…

CoD-MIL: 基于诊断链提示的多实例学习用于全切片图像分类|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 CoD-MIL: Chain-of-Diagnosis Prompting Multiple Instance Learning for Whole Slide Image Classification CoD-MIL: 基于诊断链提示的多实例学习用于全切片图像分类 01 文献速递介绍 病理检查被广泛视为肿瘤诊断的金标准&#xff0c;因为它为治疗决策和患者…

232转485模块测试

概述 常用的PLC一般会有两个左右的232口&#xff0c;以及两个左右的485口&#xff0c;CAN口等&#xff0c;但是PLC一般控制的设备可能会有很多&#xff0c;会超出通讯口的数量&#xff0c;此时我们一般会采用一个口接多个设备&#xff0c;这种情况下要注意干扰等因素&#xff0…

网络编程——TCP通信练习

目录 一、多发多收 二、接收和反馈 三、上传文件 四、解决上传文件名重复问题 五、上传文件多线程版 六、上传文件线程池版 七、B/S(接收浏览器的消息并打印) 一、多发多收 客户端&#xff1a;多次发送数据 服务器&#xff1a;接收多次数据&#xff0c;并打印 public cl…

【stm32】RTC时钟的介绍与使用

RTC时钟的介绍与使用 一、时间戳1、Unix时间戳2、UTC/GMT3、时间戳转换 二、BKP简介及代码编写1、BKP简介2、BKP基本结构3、BKP库函数介绍&#xff1a;4、程序编写&#xff1a; 三、RTC简介及代码编写1、RTC简介2、RTC框图2、RTC基本结构3、RTC相关库函数介绍&#xff1a;4、程…

在docker中搭建redis哨兵环境

文章目录 一、引言二、环境准备前提条件目录结构 三、配置文件1. 主节点配置文件 sentinel-master.conf2. 从节点配置文件3. 哨兵配置文件 sentinel.conf4. Docker Compose 文件 四、启动 Docker Compose五、验证哨兵机制1. 检查主节点状态2. 检查从节点状态3. 检查哨兵状态4. …

职场高手揭秘,细节如何左右你的成败与升迁之路

身在职场&#xff0c;每一个人都想得到老板的器重&#xff0c;能不断地加薪、升职&#xff0c;从而获得职场的成功。但你知道&#xff0c;影响一个人职场成功&#xff0c;或者说影响升职加薪的最重要因素是什么吗&#xff1f; 许多人会说那要靠运气&#xff0c;也有人认为工作…

微信小程序 高校教材征订系统

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 系统分为三个角色&#xff0c;分别是教材科、系教学秘书、教研室主任。系统主要完成功能是教材科要发布教材征订信息&am…

RNN中的梯度消失与梯度爆炸问题

梯度消失与梯度爆炸问题 循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;是一类具有短期记忆能力的神经网络&#xff0e;在循环神经网络中&#xff0c;神经元不但可以接受其他神经元的信息&#xff0c;也可以接受自身的信息&#xff0c;形成具有…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

ENSP GVRP动态学习VLAN

手工配置的VLAN称为静态VLAN&#xff0c;通过GVRP协议创建的VLAN称为动态VLAN。 GVRP有三种注册模式&#xff0c;不同的模式对静态VLAN和动态VLAN的处理方式也不同。 GVRP的三种注册模式分别定义如下&#xff1a; Normal模式&#xff1a;允许动态VLAN在端口上进行注册…

【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题

目录 1. 单例模式 (1) 饿汉模式 (2) 懒汉模式 1. 单线程版本 2. 多线程版本 2. 解决懒汉模式产生的线程安全问题 (1) 产生线程安全的原因 (2) 解决线程安全问题 1. 通过加锁让读写操作紧密执行 方法一 方法二 2. 处理加锁引入的新问题 问题描述 …

论文阅读:Computational Long Exposure Mobile Photography (二)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

大语言模型鼻祖Transformer的模型架构和底层原理

Transformer 模型的出现标志着自然语言处理&#xff08;NLP&#xff09;技术的一次重大进步。这个概念最初是针对机器翻译等任务而提出的&#xff0c;Transformer 后来被拓展成各种形式——每种形式都针对特定的应用&#xff0c;包括原始的编码器-解码器&#xff08;encoder-de…

解决vue3导出.xlsx的blob文件受损问题

1、 首先要设置get或者post请求的类型。这里我用到post请求 eg&#xff1a;在http.ts中添加公共的方法。 export function post1(url: string, params: any): Promise<AxiosResponse> | Promise<AxiosResponse<any>> {return new Promise((resolve, reject…

Jest项目实战(6):搭建文档网站

搭建文档网站 创建 API 文档可以选择如下的 3 种方式&#xff1a; 功能较少&#xff0c;可以直接写在 README.md 文件里面内容较多&#xff0c;可以单独写一个文件API 数量众多&#xff08;Vue、React 这种级别&#xff09;&#xff0c;需要考虑单独拿一个网站来做详细的文档…

STM32项目---水质水位检测

1 项目简介 1.1 项目需求 本项目通过测量水体的TDS来反映水体的质量。并同时可以测量水位&#xff08;水深&#xff09;。 1.2 系统总体设计 2 硬件模块 2.1 硬件选型 水位测量模块 TDS采集模块 外置ADC模块&#xff08;ADS1115&#xff09; 2.2 水位测量模块使用方法 …