BAT变量中的百分号学习

在BlogJava上看到如下的批处理文件,并将其转记在此:


1

2

3

4

5

6

7

8

@echo off

rem bat 获取系统时间,并去掉时间小时前面的空格

rem  2012-12-12 转自 BlogJava -"疯狂"的博客

set h=%time:~0,2%

set h=%h: =0%

set bak_filename=%date:~0,4%年%date:~5,2%月%date:~8,2%日%h%时%time:~3,2%分%time:~6,2%秒

echo %bak_filename%

pause>nul

环境变量的使用格式可写为:%Variables:~Index,Nums% 
比如,%DATE%和%TIME%是系统中的环境变量,使用ECHO %DATE% %TIME%命令可以显示当前日期和时间。%DATE:~0,4%表示取%DATE%变量的前四个字符(即从0位置向后取四位),%DATE:~5,2%表示取第5个字符后的两个字符(不包含第5个字符) 
其实在set命令的帮助中也可以找到以上符号的类似说明:

>SET /?

显示、设置或删除 cmd.exe 环境变量。

SET [variable=[string]]

variable  指定环境变量名。
  string    指定要指派给变量的一系列字符串。

要显示当前环境变量,键入不带参数的 SET。

如果命令扩展被启用,SET 会如下改变:

可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
SET 命令已使用的名称的所有变量的值。例如:

SET P

会显示所有以字母 P 打头的变量

如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
设置成 1。

SET 命令不允许变量名含有等号。

在 SET 命令中添加了两个新命令行开关:

SET /A expression
    SET /P variable=[promptString]

/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
评估器很简单并以递减的优先权顺序支持下列操作:

()                  - 分组
    ! ~ -               - 一元运算符
    * / %               - 算数运算符
    + -                 - 算数运算符
    << >>               - 逻辑移位
                       - 按位“与”
    ^                   - 按位“异”
    |                   - 按位“或”
    = *= /= %= += -=    - 赋值
      &= ^= |= <<= >>=
    ,                   - 表达式分隔符

如果您使用任何逻辑或取余操作符, 您需要将表达式字符串用
引号扩起来。在表达式中的任何非数字字符串键作为环境变量
名称,这些环境变量名称的值已在使用前转换成数字。如果指定
了一个环境变量名称,但未在当前环境中定义,那么值将被定为
零。这使您可以使用环境变量值做计算而不用键入那些 % 符号
来得到它们的值。如果 SET /A 在命令脚本外的命令行执行的,
那么它显示该表达式的最后值。该分配的操作符在分配的操作符
左边需要一个环境变量名称。除十六进制有 0x 前缀,八进制
有 0 前缀的,数字值为十进位数字。因此,0x12 与 18 和 022 
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,
因为 8 和 9 不是有效的八进制位数。(& )

/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入
行之前,显示指定的 promptString。promptString 可以是空的。

环境变量替换已如下增强:

%PATH:str1=str2%

会扩展 PATH 环境变量,用 "str2" 代替扩展结果中的每个 "str1"。
要有效地从扩展结果中删除所有的 "str1","str2" 可以是空的。
"str1" 可以以星号打头;在这种情况下,"str1" 会从扩展结果的
开始到 str1 剩余部分第一次出现的地方,都一直保持相配。

也可以为扩展名指定子字符串。

%PATH:~10,5%

会扩展 PATH 环境变量,然后只使用在扩展结果中从第 11 个(偏
移量 10)字符开始的五个字符。如果没有指定长度,则采用默认
值,即变量数值的余数。如果两个数字(偏移量和长度)都是负数,
使用的数字则是环境变量数值长度加上指定的偏移量或长度。

%PATH:~-10%

会提取 PATH 变量的最后十个字符。

%PATH:~0,-2%

会提取 PATH 变量的所有字符,除了最后两个。

终于添加了延迟环境变量扩充的支持。该支持总是按默认值被
停用,但也可以通过 CMD.EXE 的 /V 命令行开关而被启用/停用。
请参阅 CMD /?

考虑到读取一行文本时所遇到的目前扩充的限制时,延迟环境
变量扩充是很有用的,而不是执行的时候。以下例子说明直接
变量扩充的问题:

set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )

不会显示消息,因为在读到第一个 IF 语句时,BOTH IF 语句中
的 %VAR% 会被代替;原因是: 它包含 IF 的文体,IF 是一个
复合语句。所以,复合语句中的 IF 实际上是在比较 "before" 和
"after",这两者永远不会相等。同样,以下这个例子也不会达到
预期效果:

set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

原因是,它不会在目前的目录中建立一个文件列表,而只是将
LIST 变量设成找到的最后一个文件。这也是因为 %LIST% 在
FOR 语句被读取时,只被扩充了一次;而且,那时的 LIST 变量
是空的。因此,我们真正执行的 FOR 循环是:

for %i in (*) do set LIST= %i

这个循环继续将 LIST 设成找到的最后一个文件。

延迟环境变量扩充允许您使用一个不同的字符(惊叹号)在执行
时间扩充环境变量。如果延迟的变量扩充被启用,可以将上面
例子写成以下所示,以达到预期效果:

set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

如果命令扩展被启用,有几个动态环境变量可以被扩展,但不会出现在 SET 显示的变
量列表中。每次变量数值被扩展时,这些变量数值都会被动态计算。如果用户用这些
名称中任何一个明确定义变量,那个定义会替代下面描述的动态定义:

%CD% - 扩展到当前目录字符串。

%DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。

%TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。

%RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。

%ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。

%CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。

%CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。

%HIGHESTNUMANODENUMBER% - 扩展到此计算机上的最高 NUMA 节点号。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

在批处理应用中, SET 是经常出现的一条重要命令,利用它可以定义变量,

从而使批处理具有了与编程语言中的变量相通的特点,因此利用 SET 命令可以编写出功能较为完善的批处理程序;

BAT变量中的百分号学习

时间: 2024-10-16 11:25:54

BAT变量中的百分号学习的相关文章

bat文件中批处理设置变量延迟的问题

在bat文件中想实现对变量的赋值和输出,发现设置的变量在后续使用中为空,代码如下: @echo off for %%i in (*) do ( set var=%%i echo %var% ) 理论上,输出结果应为当前命令所在目录里的所有文件名,可实际的输出结果 却为问题分析:这涉及到批处理命令中的变量延迟扩展问题,详细请参考:https://blog.csdn.net/subkiller/article/details/7344509解决方法: @echo off for %%i in (*)

bat批处理中怎样用while循环

bat 常用命令 echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令,我们就从他们开始学起. ==== 注 =========== 首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space(20) 常用的参数界定符 Tab(09) ; = 不常用的参数界定符  + COPY命

项目中走马观花式学习PHP

项目中走马观花式学习PHP 因项目缘故,需要快速补充php知识,个人有asp基础,较熟悉aspx.c#winform编写,故选择了快速阅读PHP相关资料.整理了一下,给大家参考.阅读的资料都是来自网络,我也不说不清作者是谁了,这里要对带我们这些菜鸟飞的前辈和大神们表示感谢.此外和我一样学过asp的朋友请百度一下php和asp语法的不同,对自己帮助很大. 第一部分相关知识补充 一.PHP准备工作 (一)PHP环境搭建(略) 建议使用apm,修改相关的参数即可搭建好环境.详情随便百度一下.... 第

[No000010] Ruby 中一些百分号(%)的用法小结

#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#%Q #用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") puts %Q(1.Joe said: "Frank said: "#{what_frank_said}"") #“#”不能省 =

shell中的eval学习与应用

一.bash命令处理的12个步骤: 1.将命令行分成由固定元字符集分隔的记号: SPACE, TAB, NEWLINE, ; , (, ),<, >, |,& 记号类型包括单词,关键字,I/O重定向符和分号.2.检测每个命令的第一个记号,查看是否为不带引号或反斜线的关键字. 如果是一个开放的关键字,如if和其他控制结构起始字符串,function,{或(,则命令实际上为一复合命令.shell在内部对复合命令进行处理,读取下一个命令,并重复这一过程.如果关键字不是复合命令起始字符串(如t

JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用。--------转载

JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用. 今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找,找到遍文章,觉得不错,就留下了.      仅供记录学习.转自:http://bbs.tech.163.com/bbs/tech_0ik1/147645925.html 在把jdk安装到计算机中之后,我们来进行设置使java环境能够使用. 首先右键点我的电脑.打开属性.然后选择“高级”里面的“环境

C++面向对象—成员函数与成员变量的实现机制学习笔记(1)

<深度搜索C++对象模型>的一些学习纪要: 原文链接:ordeder   http://blog.csdn.net/ordeder/article/details/26396989 一成员变量篇 0. 类的编译中,先编译成员变量和成员函数的额声明,成员函数的定义在类声明结束后再处理: 1. 类中,多个代码区块public或者private最终会被按区块统一,然后编译过程中,后定义的成员变量地址高于定义的成员变量: 2. 静态变量在程序启动时初始化,存储的位置在于程序的全局数据段中: 3. 继承

XML From Action Script[AS中的XML学习笔记]

XML From Action Script XML 是 eXtensible Markup Language (可扩展标记语言)的缩写. E4X ECMAScript for XML 规范定义了一组用于处理 XML 数据的类和功能.这些类和功能统称为 E4X. ActionScript 3.0 包含 以下 E4X 类:XML. XMLList. QName 和 Namespace. E4X 包含了一些直观运算符(如点 (.) 和属性标识符 (@) 运算符),用于访问 XML 中的属性 (pro

在BAT文件中实现对空格分割的字符串的处理

1.      Bat代码 @echo off REM 待处理的字符串 set str="AAA BBB CCC" :STR_VISTOR REM 看看每次循环后的值,便于理解 echo str = %str% REM FOR语句是按行进行遍历,也就是一行一次循环,对于我们来说,只有一行字符串, REM 这个FOR循环肯定只进入一次.而我们是要对字符串进行空格分割后再处理.因此这 REM 里用GOTO语句来实现循环.而FOR语句只需看成是一条语句,这条语句实现了这样的 REM 功能:将