`

.bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别

    博客分类:
  • bat
阅读更多

 

转自:https://blog.csdn.net/shihengzhen101/article/details/102985590

 

前言

最近使用批处理程序处理文件的时候,发现这 bat中的变量形式真是“变化多端”,有时候加1个百分号%,有时候加2个百分号%%,还有的时候加感叹号!,真是让初学者一头雾水,于是查询资料做了一些小测试,终于大致弄清楚了这些变量的含义,接下来一一列举出来。

变量对比

下面通过一些具体的例子来看下标题中提到的这些变量什么时候使用,使用的时候有哪些注意事项。

%0

这个是批处理程序中的固定用法,类似于C++程序main函数中argv变量数组,类比可以知道,argv[0]表示exe程序的文件名,argv[1]表示启动程序的第1个参数,后面依次类推。而在批处理程序中%0表示这个批处理程序的文件名,%1表示调用这个批处理时传入的第1个参数,%2表示调用这个批处理时传入的第2个参数,最大可以到%9,具体用法可以参考之前的总结《.bat批处理(二):%0 %1——给批处理脚本传递参数》,简单测试如下:

@echo off

echo param0=%0
echo param0=%1
echo param0=%2
  • 1
  • 2
  • 3
  • 4
  • 5

将上述代码保存在文件testparams.bat中,从cmd命令行运行批处理文件,只传入一个参数,运行结果如下:

C:\Users\Administrator\Downloads>testparams.bat “hello world”
param0=testparams.bat
param1=“hello world”
param2=

%i

在题目所列的这些变量中,这一个比较特殊,因为它不是批处理文件中的变量,只能用于cmd命令行下的for循环中,在命令行中for循环的语法是for %variable in (set) do command [command-parameters],其中的variable只能是单字母或者非特殊含义的字符,同样的for循环语句如果写在批处理文件中variable之前就要加两个%%了,先来看看%i的用法,直接在命令行中遍历集合打印输出:

C:\Users\Administrator\Downloads>for %i in (1,3,5,8) do echo %i
C:\Users\Administrator\Downloads>echo 1
1
C:\Users\Administrator\Downloads>echo 3
3
C:\Users\Administrator\Downloads>echo 5
5
C:\Users\Administrator\Downloads>echo 8
8

如果将其中的%i改成%%i,就会报语法错误,测试结果如下:

C:\Users\Administrator\Downloads>for %%i in (1,3,5,8) do echo %%i
此时不应有 %%i。

%%i

这种类型也是for循环中特有的,与%i相对,属于批处理程序的用法,换句话说就是在for循环中遍历的索引变量,如果在命令行中定义需要一个%,如果相同的语句定义在批处理文件中需要2个%%,语法为for %%variable in (set) do command [command-parameters],variable同样只能是单个字母或者普通字符,至于为什么同样含义的变量在批处理中要多加一个%,至今也没有找到官方的说法,查找MSDN也没有发现说明,不过就我个人理解可能就像我们在命令行中打印一个%,可以正常打印输出,如果通过printf()想输出%就需要2个%的原理一样吧,测试如下:

for %%i in (1,3,5,8) do echo %%i
  • 1

运行结果:

C:\Users\Administrator\Downloads>testfor.bat
C:\Users\Administrator\Downloads>for %i in (1 3 5 8) do echo %i
C:\Users\Administrator\Downloads>echo 1
1
C:\Users\Administrator\Downloads>echo 3
3
C:\Users\Administrator\Downloads>echo 5
5
C:\Users\Administrator\Downloads>echo 8
8

观察运行结果发现,运行批处理文件的时候,实际上去掉了%%i变量的1个%,将文件中代码改为1个%试下:

for %i in (1,3,5,8) do echo %i
  • 1

运行结果:

C:\Users\Administrator\Downloads>testfor.bat
此时不应有 i。

var

这个变量看起来挺正常的,也没有那么多奇奇怪怪的字符,和Lua、Python等语言中的变量长得挺像,实际上变量的这种形式很“短暂”,一般只能出现在给变量赋值的时候,也就是set语句之后,作为左值接受赋值时,或者在等号右测可评估的表达式中,举个例子,编写下面代码保存在normalVar.bat中:

@echo off

set var1=1
set /a var2=var1+1

echo var1
echo var2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行之后的结果为:

C:\Users\Administrator\Downloads>normalVar.bat
var1
var2

看完结果之后觉得很神奇是不是,为什么和我学的其他语言不一样呢,我使用set分别为var1和var2赋了值,但是输出的时候居然不是数字而是变量名,其实这就引出了之后%var%这种用法,接着往下看。

%var%

在批处理中除了上面所说的在set语句后面的两种情况,再要想引用变量就需要在变量两端各加一个百分号%,明确的告诉引用者这是一个变量,使用时需要评估一下值,而不要当成字符串,上一个例子中echo后面想要输出的变量没有加%,那就被当成一个字符串处理,原样输出了,修改上个例子如下:

@echo off

set var1=1
set /a var2=var1+1

set var3=%var2%

echo %var1%
echo %var2%
echo %var3%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

运行之后运行结果入下:

C:\Users\Administrator\Downloads>normalVar.bat
1
2
2

看了这次的结果感觉正常多了,有一点需要注意,set var3=%var2%这一句中var2变量中的%不能省略,因为它既不属于左值也不属于被评估值的表达式,如果不加%,赋值后var3的值会变成“var2”这个字符串。

!var!

这是最后一种常见的变量形式,同时也是一种不太好理解的形式,需要记住一点,这种变量与延迟环境变量扩展有关,如果没开启延迟环境变量扩展,那么!var!就是一个普通的包含5个字母的字符串,如果开启了延迟环境变量扩展,那么它就是变量var的实际值,可能说到这有的人会产生疑惑,引用变量var的值不是使用%var%吗?那么在开启延迟环境变量扩展的情况下,%var%和!var!有什么区别呢?下面举个例子测试下,编写如下代码保存在extVar.bat文件中:

@echo off

set var1=110
set var1=120&echo %var1%
  • 1
  • 2
  • 3
  • 4

运行之后的结果为:

C:\Users\Administrator\Downloads>extVar.bat
110

看到结果的时候是不是再次怀疑了世界,在打印变量var1之前明明重新赋值了120,为什么打印出来还是110呢?其实这是批处理脚本执行机制导致的,它会按行执行,在执行之前会先预处理,当执行set var1=110之后,变量var1变成了110,在执行set var1=120&echo %var1%之前先预处理,将变量%var1%替换成了110,然后语句变成了set var1=120&echo 110,所以就得到了我们上面测试的结果。

想要解决这个问题就需要开启延迟环境变量扩展,语句为setlocal enabledelayedexpansion,然后将引用变量的形式由%var1%改为!var1!即可,所以可以修改代码如下:

@echo off

setlocal enabledelayedexpansion
set var1=110
set var1=120&echo !var1!
  • 1
  • 2
  • 3
  • 4
  • 5

运行之后的结果为:

C:\Users\Administrator\Downloads>extVar.bat
120

这回输出的结果符合预期了,开启了延迟环境变量扩展之后,!var!形式的变量在用之前才会评估确切的值,这是一个知识点,也是一个易错点,特别是在for循环中要格外注意,因为for循环语句的循环体括号中,所有的操作被看成是同一行,所以经常会用到延迟环境变量扩展。

总结

  1. for循环在cmd命令行中的固定用法for %i in (set) do (...),循环变量格式为%i
  2. for循环在bat处理程序中的固定用法for %%i in (set) do (...),循环变量格式为%%i
  3. 至于为什么for语法在批处理中需要多写一个%,希望知道的小伙伴能给出答案和参考资料,不胜感激
  4. 想要变量被使用的时候再评估值需要开启延迟环境变量扩展,语法为setlocal enabledelayedexpansion,同时使用!var!形式的变量
分享到:
评论

相关推荐

    bat.rar_.bat_bat_批处理

    4. **变量与参数**:批处理可以使用 `%var%` 形式的变量,以及通过命令行传递的参数(`%1`, `%2`, ... `%9`)。 5. **内部命令与外部命令**:内部命令是直接由CMD解释器执行的,如`echo`和`pause`;外部命令是独立...

    Bat批处理实例练习.rar

    总之,这个"Bat批处理实例练习.rar"包含的内容全面且实用,不仅覆盖了批处理的基本元素,还涉及了循环、变量延迟和子批处理调用等进阶主题,对于想要学习和提升批处理技能的人来说是一份宝贵的资源。通过实际操作...

    批处理文件制作详细教程

    通过学习这个批处理详细教程,你可以掌握批处理文件的基本概念、常用命令和高级技巧,从而在日常工作中实现各种自动化任务,提高效率。实践中不断尝试和探索,你会发现批处理文件是一个强大而实用的工具。

    bat批处理命令教程,简单实用。

    - `set`命令用于设置变量,如 `set var=Hello` 设置变量var的值为"Hello"。 - `setlocal` 和 `endlocal` 用于局部变量的管理,避免影响全局环境。 5. **批处理高级技巧** - **管道符** (`|`):连接两个命令,将...

    BAT 批处理脚本 教程

    ### BAT 批处理脚本教程知识点详解 #### 第一章 批处理基础 ##### 第一节 常用批处理内部命令简介 **批处理定义**:批处理文件是一种特殊的文本文件,它由一系列按顺序排列的命令组成,并且可以作为一个整体被...

    批处理标准教程.bat

    然后,要掌握批处理语法,包括变量的使用(如`%var%`)、命令行参数(%0~9%)以及批处理内部命令,如`set`用于设置变量,`echo`用于输出信息,`pause`用于暂停脚本执行等待用户输入等。 在《批处理标准教程》中,...

    批处理教程制作.BAT文件

    ### 批处理教程:制作与使用 .BAT 文件 在计算机技术领域中,批处理脚本是一种非常实用且功能强大的工具,它可以自动化执行一系列命令或任务,极大地提高工作效率。本文将基于给定的部分内容来深入探讨批处理脚本的...

    批处理.rar 批处理.rar

    2. **变量与参数**:批处理中可以定义变量,如`SET var=value`,用于存储数据。命令行参数 `%1`, `%2`, `%3` 等用于接收传递给批处理文件的参数,便于自定义功能。 3. **批处理流程控制**:`IF`语句允许根据条件...

    BAT批处理文件语法.rar

    BAT批处理文件,也称为批处理脚本,是Windows操作系统中的一个强大工具,它允许用户通过编写简单的文本文件来执行一系列命令,极大地提高了系统管理和自动化任务的效率。这些批处理文件通常以.bat或.cmd为扩展名,...

    BAT批处理脚本-普及讲解CSty.zip

    BAT批处理脚本是Windows操作系统中一种非常实用的自动化工具,它基于DOS命令行环境,允许用户编写一系列命令,以实现批量执行任务的目的。在本文中,我们将深入探讨批处理脚本的基本概念、语法、常见用法以及如何...

    bat批处理使用详细教程(DOC格式)

    这个“bat批处理使用详细教程(DOC格式)”文档将涵盖批处理的基本概念、语法、常用命令以及实际应用。 **批处理文件结构** 一个批处理文件通常由命令、注释和变量等构成。命令是批处理的核心,如`COPY`用于复制文件...

    bat批处理教程挺全的哦

    批处理(Batch Processing)是一种在计算机领域中用于自动化执行一系列命令或程序的技术,尤其在Windows系统中,通常通过扩展名为`.bat`或`.cmd`的批处理脚本来实现。这些脚本文件是文本文件,包含了一系列的DOS命令...

    批处理命令基础教程入门

    1. 使用变量:通过`set`命令设置变量,如`set var=Hello`,然后可以用`%var%`引用变量。 2. 引用命令行参数:在批处理文件中,`%1`表示第一个命令行参数,`%2`表示第二个,以此类推。 3. 使用管道`|`和重定向`>`、`...

    手把手教你写批处理-批处理的介绍

    批处理文件通常以`.bat`或`.cmd`为扩展名,它允许用户通过简单的文本脚本,一次性运行多个命令,提高工作效率。下面将详细讲解批处理的基本概念、结构、常用命令以及实际应用。 一、批处理的基本概念 批处理源于...

    BAT批处理脚本-临时运行(bat).zip

    3. **变量与环境变量**:批处理脚本可以定义和使用变量,如`SET var=value`来设置变量,`%var%`来引用变量。此外,系统还提供了许多预定义的环境变量,如 `%USERPROFILE%`指向当前用户的个人文件夹, `%PATH%`包含可...

    BAT批处理脚本-复件 2.zip

    BAT批处理脚本是一种在Windows操作系统中广泛使用的自动化工具,它允许用户通过编写简单的文本文件来执行一系列命令,实现对系统的管理和任务自动化。这个“BAT批处理脚本-复件 2.zip”压缩包中包含了一个名为“复件...

    BAT批处理脚本-文本操作-set截取字符详解.zip

    1. **%var:~start,len%**:这种形式用于截取变量`var`从`start`位置开始的`len`个字符。`start`是从0开始的索引,`len`是截取的长度。例如: ```batch set str=Hello, World! echo %str:~0,5% ``` 上面的代码会输出`...

    bat_批处理_语法

    它们以.bat或.cmd为扩展名,允许用户通过简单的程序逻辑(如条件语句、循环结构)来组织和运行DOS命令,而无需深入编程语言。批处理文件的灵活性在于它们可以调用其他程序并进行参数传递,甚至可以改变系统环境。 ...

    。bat 批处理文件的写法

    批处理文件(.bat)是DOS和Windows操作系统中用于自动化执行一系列命令的脚本文件。这些文件通常由用户创建,以简化重复性任务或执行复杂的系统管理操作。以下是对"。bat 批处理文件的写法"进行的详细解释: ### 1....

Global site tag (gtag.js) - Google Analytics