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.mzph.cn/diannao/59635.shtml

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

相关文章

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个&#xff1a;客户端和服务器。客户端是提供请求的&#xff0c;归用户使用&#xff0c;发送的请求会被服务器接收&#xff0c;服务器根据请求做出响应&#xff0c;然后再将响应的数据包返回给客户端。 作为程序员&#xff0c;我们主要关心应…

使用C++来编写VTK项目时,就是要写自己的算法

其实&#xff0c;使用VTK可以使用很多种语言&#xff0c;比如java&#xff0c;python&#xff0c;和C。那么为什么非要使用C 呢&#xff1f;一个原因是觉得C语言处理数据比较快&#xff0c;另一个原因是需要自己写算法。通过继承polyDataAlgorithm来写自己的算法&#xff0c;很…

[ 内网渗透实战篇-2 ] 父域子域架构的搭建与安装域环境判断域控定位组策略域森林架构配置信任关系

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输

在数字化时代&#xff0c;跨网络、跨区域的数据传输成为了企业和个人信息流通的重大挑战。而如今&#xff0c;FileLink跨网数据摆渡系统的问世&#xff0c;彻底解决了这一难题&#xff0c;帮助用户实现快速、安全、无缝的跨网络数据传输。 1. 跨网络数据传输的痛点 随着企业信…

MySQL_聚合函数分组查询

上篇复习&#xff1a; 设计数据库时的三大范式1.第一范式&#xff0c;一行数据中每一列不可再分 关系型数据库必须要满足第一范式&#xff0c;设计表的时候&#xff0c;如果每一列都可以用SQL规定的数据类型描述&#xff0c;就天然满足第一范式. 2.第二范式&#xff0c;在第一…

【Ai教程】Ollma安装 | 0代码本地运行Qwen大模型,保姆级教程来了!

我们平时使用的ChatGPT、kimi、豆包等Ai对话工具&#xff0c;其服务器都是部署在各家公司的机房里&#xff0c;如果我们有一些隐私数据发到对话中&#xff0c;很难保证信息是否安全等问题&#xff0c;如何在保证数据安全的情况下&#xff0c;又可以使用大预言模型&#xff0c;O…

FastAPI全方位分析:优劣尽显

近年来,随着技术的飞速发展,快速构建高性能API的需求越来越强烈。Python作为一个广泛使用的编程语言,也在这一领域下涌现出了许多优秀的框架。FastAPI便是其中一颗璀璨的新星。 FastAPI以其卓越的性能和独特的功能吸引了众多开发者。本文将深入剖析FastAPI的各个方面,详细…

LongVU :Meta AI 的解锁长视频理解模型,利用自适应时空压缩技术彻底改变视频理解方式

Meta AI在视频理解方面取得了令人瞩目的里程碑式成就&#xff0c;推出了LongVU&#xff0c;这是一种开创性的模型&#xff0c;能够理解以前对人工智能系统来说具有挑战性的长视频。 研究论文 "LongVU&#xff1a;用于长视频语言理解的时空自适应压缩 "提出了一种革命…

什么是兼容性测试

兼容性测试&#xff0c;提供具有兼容性特性的云端设备&#xff08;覆盖主流品牌、SDK、分辨率&#xff09;&#xff0c;通过模拟用户行为进行真机测试。及时有效的发现应用中存在的兼容性问题。解除测试人员的双手&#xff0c;提高测试效率&#xff0c;保证产品在海量真机上的高…

IDEA:ctrl+/ 快捷键生成的注释,设置“//”开始位置

问题场景&#xff1a; IDEA中使用 ctrl/ 快捷键&#xff0c;//显示在最左边&#xff08;顶格&#xff09;&#xff0c;不美观&#xff0c;中间隔了好长的空格&#xff0c;如图&#xff1a; 解决方法: 操作步骤 File–>Sttings–>Editor–>Code Style–>Java–>…

IDEA2024下安装kubernetes插件并配置进行使用

【1】安装插件 其实2024.2.3下默认已经安装了kubernetes插件&#xff0c;如果你发现自己IDEA中没有&#xff0c;在市场里面检索并下载即可。 【2】kubernetes配置 ① 前置工作 首先你要准备一个config文件和一个kubectl.exe 。 config文件类似如下&#xff1a; apiVersi…

H7-TOOL的CAN/CANFD助手增加帧发送成功标识支持, 继续加强完善功能细节

2.27版本固件正式携带此功能&#xff0c;包括之前做的负载率检测和错误信息展示也将集成到这个版本固件中。 对于接收&#xff0c;我们可以直接看到效果&#xff0c;而发送不行&#xff0c;所以打算在发送的地方展示下发送成功标识。CAN发送不像串口&#xff0c;需要等待应答后…

CSP/信奥赛C++刷题训练:经典广搜例题(4):洛谷P1746 :离开中山路

CSP/信奥赛C刷题训练&#xff1a;经典广搜例题&#xff08;4&#xff09;&#xff1a;洛谷P1746 &#xff1a;离开中山路 题目背景 《爱与愁的故事第三弹shopping》最终章。 题目描述 爱与愁大神买完东西后&#xff0c;打算坐车离开中山路。现在爱与愁大神在 x 1 , y 1 x_1…

CST汽车天线仿真(双向混合求解)

CST从2018版本开始具有双向混合求解&#xff0c;到2019版已经通用微波工作室的各个求解器之间的双向混合。具体的混合对象如下图&#xff1a; 对天线的安装和耦合仿真&#xff0c;意味着对复杂结构&#xff08;天线&#xff09;和电大尺寸环境&#xff08;安装平台&#xff0c;…

【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(下)

系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;上&#xff09; 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器&#xff08;下&#xff09; 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇&#xff08;上&#xff09; 【…

【HCIP园区网综合拓扑实验】配置步骤与详解(未施工完,持续更新中)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan 4、上层通过静态路由协议完成数据通信过程 5、…

C++设计模式结构型模式———外观模式

文章目录 一、引言二、外观模式三、总结 一、引言 外观模式是一种结构型设计模式&#xff0c; 能为程序库、 框架或其他复杂类提供一个简单的接口。也就是说&#xff0c;该模式的目的用于隔离接口&#xff0c;换句话说&#xff0c;就是扮演中间层的角色&#xff0c;把本来结合…

软件设计师:排序算法总结

一、直接插入 排序方式&#xff1a;从第一个数开始&#xff0c;拿两个数比较&#xff0c;把后面一位跟前面的数比较&#xff0c;把较小的数放在前面一位 二、希尔 排序方式&#xff1a;按“增量序列&#xff08;步长&#xff09;”分组比较&#xff0c;组内元素比较交换 假设…

vue输入中文,获取英文首字母缩写

背景&#xff1a;要求输入中文的时候&#xff0c;系统给出对应的首字母大写&#xff0c;作为拼音。 例如&#xff1a;输入“博客”&#xff0c;输出‘BK’ 等等…… 经查&#xff1a;使用 js-pinyin 这个第三方插件即可实现 1. 下载依赖 npm install js-pinyin 或者 yarn ad…

数据结构与算法--回溯法

回溯法 1 括号生成分析&#xff1a; 2 解数独分析代码 回溯法本质是的暴力枚举/遍历法&#xff0c;一般用递归实现。 当我们可以把问题分解为若干个步骤&#xff0c;每个步骤都有若干个选择的时候&#xff0c;若需要列出所有解答形式&#xff0c;则采用枚举法。 1 括号生成 数…