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;很…

【RK3588 Linux 5.x 内核编程】-等待队列(WaitQueue)

等待队列(WaitQueue) 文章目录 等待队列(WaitQueue)1、等待队列介绍2、等待队列初始化2.1 静态初始化2.2 动态初始化3、队列任务排队3.1 wait_event3.2 wait_event_timeout3.3 wait_event_cmd3.4 wait_event_interruptible3.5 wait_event_interruptible_timeout3.6 wait_ev…

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

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

unity c# Tcp网络通讯

本篇附带源代码&#xff0c;带有处理拆包分包粘包&#xff0c;也会撰明具体内容。 首先对于tcp就是挥手机制&#xff0c;三次握手四次挥手机制。 一、三次握手 具体过程为简单解释为&#xff1a; 1、客户端请求服务器链接&#xff0c;等待服务器确认。&#xff08;服务器如…

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

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

高级 SQL 技巧详解

文章目录 高级 SQL 技巧详解一、引言二、窗口函数1、窗口函数的使用1.1、RANK() 函数示例1.2、常用窗口函数 三、公共表表达式&#xff08;CTE&#xff09;2、CTE 的使用2.1、CTE 示例 四、索引优化3、索引的创建与优化3.1、创建索引3.2、索引类型与注意事项 五、事务管理4、事…

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;用于长视频语言理解的时空自适应压缩 "提出了一种革命…

二分答案—愤怒的牛-P1676 [USACO05FEB] Aggressive cows G

[USACO05FEB] Aggressive cows G 题目描述 农夫约翰建造了一座有 n n n 间牛舍的小屋&#xff0c;牛舍排在一条直线上&#xff0c;第 i i i 间牛舍在 x i x_i xi​ 的位置&#xff0c;但是约翰的 m m m 头牛对小屋很不满意&#xff0c;因此经常互相攻击。约翰为了防止牛之…

什么是兼容性测试

兼容性测试&#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–>…

中文文章进行加密编码及解码的方法python实现

愿我们终有重逢之时,而你还记得我们曾经讨论的话题。 group 868373192 second group 277356808 在Python中,可以使用多种方法对中文文章进行加密编码及解码。以下是几种常见的方法: 1. 使用Base64编码 Base64是一种基于64个可打印字符来表示二进制数据的编码方式。它可以…

掌握springboot过滤器,拦截器 ,aop

前言&#xff1a; Spring Boot 中的过滤器&#xff08;Filter&#xff09;、拦截器&#xff08;Interceptor&#xff09;和 AOP&#xff08;面向切面编程&#xff09;都是处理请求的常用技术&#xff0c;但它们在处理请求的时机、范围和方式上有所不同。下面详解分别介绍&#…

XLA中生成Causal Mask上三角-inf矩阵

transformers生成CausalAttentionMask的上三角-inf矩阵&#xff1a; 参考transformers源码 import torch import torch_xla import torch_xla.core.xla_model as xm import osos.environ[PJRT_DEVICE]IPU # os.environ[PJRT_DEVICE]GPU # os.environ[XLA_FLAGS]--xla_dump_tog…

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;需要等待应答后…

微调LLM时,full、freeze、lora区别

LLama-Factory支持full、freeze、lora三种微调&#xff0c;区别&#xff1a; Full微调&#xff1a;Full微调是指在微调过程中更新整个模型的所有参数。这意味着所有的层和参数都会被更新&#xff0c;并且在微调期间都会参与训练。Full微调通常用于对模型进行全面的调整&#xf…