Windows批处理中的变量和值

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
通过前面临批处理的先容,我们已经准备好了开始编码,本日我们将讨论变量、值和批处理的set下令,该下令将一个值赋值给一个变量。如果您用过其他计算机语言做过开发,这些可能显得微不足道,但是批处理有一些独特的特性需要我们去注意。
通过本文,您将学习如何在控制台中显示变量的值,以确认它已被正确设置。此外,我将先容下令分隔符,它允许您在一行中输入多个下令。我还将向您展示如何创建注释和设置保存在计算机上的变量,这些变量即使在bat文件关闭后也仍旧可用。末了,您将学习如何在下令提示符下访问任何批处理下令的文档,这对于使用bat文件的任何人来说都是一项有用的技能。
设置息争析变量

变量是一个命名字段,它在内存中界说了一个位置,该位置保存了供以后使用的值。大多数计算机语言允许并且通常要求在赋值之前将变量界说为特定的数据类型,常用的是字符串或数字。批处理通常不用设置具体的数据类型;变量在第一次被“设置”为一个值时就存在了,这个值可以包含字母、数字和其他字符。然后由编码人员决定是否将它们视为特定的数据类型。本文的重点是为变量赋值这一看似简单的使命。
考虑一个变量的例子,一个程序员可能有一个包含他们情绪状态的字段。变量被界说为或命名为myMood,其中两个可能的值是happy和sad。要将变量设置为happy,这里可以使用set下令:
  1. > set myMood=happy
复制代码
实行完这个下令后,myMood变量包含了happy值。
下面的下令将删除先前的值并用另一个值替换它:
  1. > set myMood=nonplussed
复制代码
但是如何确定这个或其他变量的值呢?在批处理中,显示变量值的举动被称为解析变量,通常在变量两边加上百分号来完成。也就是说,在前面的set下令实行后,%myMood%将解析为nonplsed。如今,为了实际看到解析变量的效果,我们需要相识变量之外的知识。
显示变量的值

在这里我们将学习如何在计算机屏幕上快速显示变量的解析值,但这种技能的用途远不止于此。我们将在以后的文章中来演示批处理的许多其他特性,比方使用它作为测试技能,这对任何批处理程序都是有用的。
写入控制台

要在屏幕上显示变量的内容,我们需要两个额外的下令:echo和pause。下面我们创建一个简单的bat文件。在计算机上打开一个新文件夹,比如D:\Batch\,并在其中创建一个名为Mood.bat的bat文件,代码如下:
  1. set myMood=happy
  2. echo My mood is %myMood%.
  3. pause
复制代码
这里bat文件Mood.bat显示一个已解析的变量。
如果双击或打开Mood.bat, bat文件将被实行,并出现一个带有白色文本的黑色窗口。这个窗口就是DOS窗口大概叫控制台。
前面我们已经相识了set下令。在这里,echo下令是将语句的其余部分(不包括echo自己及后面的空格)写到控制台。显示文本My mood is和尾随空格,后跟myMood的内容或值(即文本happy)和末了的句号。pause下令使控制台保持打开状态。没有它,窗口将会一闪而过,我们什么效果都看不到(即窗口打开后立即关闭了)。
打开后控制台具体显示内容如下:
  1. D:\Batch>set myMood=happy
  2. D:\Batch>echo My mood is happy.
  3. My mood is happy.
  4. D:\Batch>pause
  5. 请按任意键继续. . .
复制代码
每个下令前面都有当前目录D:\Batch\,后面跟着一个大于号(>)作为分隔符。
第一行显示set下令的实行,第二行显示echo下令的实行。第三行是实行该echo的效果,即控制台输出。您可以看出它不是下令,因为前面没有文本D:\Batch>。这里需要注意的是%myMood%解析为文本happy了。pause下令也会产生输出,为文本请按恣意键继续…,如控制台所示,实行将暂停,直到按下任何键,此时bat文件将竣事,控制台将关闭。另外,请注意set下令不产生任何输出,因为它只是设置一个变量的值。
清除控制台

写入控制台的内容的一个问题是,下令与echo和pause下令的期望输出交织在一起。这里我们来看看一个快速清理的方法。在Mood.bat bat文件的顶部添加@echo off后再次实行:
  1. @echo offset myMood=happy
  2. echo My mood is %myMood%.
  3. pause
复制代码
这个echo off下令克制的不是后续下令的实际输出,而是显示正在实行的每个下令的行—即以当前目录为前缀的行。此外,在echo下令前加上@符号(@)会阻止它自己的实行被写入控制台。
与前面相比,当实行修改后的bat文件时,控制台显示更加清晰:
  1. My mood is happy.
  2. 请按任意键继续. . .
复制代码
如今我们可以很容易地演示如何将myMood变量初始化为gloomy,然后将其重置为cheerful:
  1. @echo off
  2. set myMood=gloomy
  3. echo My mood is %myMood%.
  4. set myMood=cheerful
  5. echo Now my mood is %myMood%.
  6. pause
复制代码
效果显示同一个变量在两个不同的时间被解析为两个不同的值:
  1. My mood is gloomy.
  2. Now my mood is cheerful.
  3. 请按任意键继续. . .
复制代码
随着我们的bat文件变得越来越复杂,echo下令可以将输出发送到控制台以外的地方。
set下令的特性

对于大多数编程语言来说,设置变量通常是一个简单的事情,但批处理与大多数编程语言不同。所有批处理程序员都需要相识set下令的以下特性,以避免将来某种程度的痛苦。
大小写敏感

仔细检查以下两个下令。它们看起来有点不同,但功能相同:
  1. SET myMood=whimsical
  2. set MYMOOD=whimsical
复制代码
批处理下令和变量不区分大小写。在这里,set下令在一个下令中是大写的,在另一个下令中是小写的,但是表明器将它们视为相同的。您也可以在不改变功能的情况下使用Set。为了更好地衡量,sET和sET也以相同的方式工作。同样,您可以互换使用myMood、MYMOOD和mymood变量。但是,该值是按照键入的方式存储的,因此它是区分大小写的。如果变量被设置为WHIMSICAL,将被解析为WHIMSICAL;同样,如果它被设置为Whimsical,它将被解析为Whimsical。
这完全是风格和个人喜欢的问题。我发现许多bat文件有太多的内容大写。大写是为了突出某些东西,但当所有东西都闪烁着霓虹灯时,什么都不突出。大多数批处理程序员将下令名称中的所有字母大写,但在我们这里,我只使用小写字符来表示所有批处理下令。另外,我也非常喜欢驼峰式变量。
注意:
驼峰大小写文本很容易阅读,即使它包含多个单词,没有空格或其他字符分隔。驼峰大小写文本的第一个字母可以是大写或小写。但是要符合驼峰大小写,所有后续单词的第一个字母必须大写,其余单词必须小写。MyMood就是一个例子(也称为Pascal或上驼峰)。相应的myMood也是一个很好的例子(也称为单峰或下骆驼)。
有效的变量字符

大多数编程语言对于变量名中允许的字符列表都有严格的规则。通常情况下,数字和26个字母(大写和小写)是允许的,只有几个特别字符可以使用。但是批处理的独特之处在于,键盘上的几乎每个字符都是有效的变量名字符,但是我们应该尽量避免在变量名中使用数字作为第一个字符。
一些字符是非法的,因为它们在批处理中有特定的用途;比方,波浪号(~)、&号(&)、百分号(%)和小于号()都是保留字符,但是其他几个字符会让不熟悉批处理的程序员感到惊奇。下面三个变量在批处理中也是合法的:
  1. set ;=semicolon
  2. set @=at
  3. set #=hashtag
  4. echo %;% %@% %#%
  5. pause
复制代码
乃至下面的怪异变量也存储了文本,这实际上是在带有美元符号、点和不匹配括号的变量中工作的:
  1. set var$with.odd[chars}=This actually works
复制代码
这个变量名演示了各种怪异的变量都是可能的,但是很难阅读,不推荐使用。
然而,在变量名中明智地使用这些字符可能是一个方便的工具。比方,一组相干变量可能都有一个开头或末端下划线作为这种关联;number可以缩写为#,比NBR更简洁,比no更清晰。在后面,我将使用这个风趣的特性来构建数组和哈希表,这些数组和哈希表的名称包含括号。
赋值操作符周围的空格

以下是大多数熟悉其他语言的批处理程序新手都会犯的典型错误。仔细检查下面的set下令。
  1. set X = Hello
  2. echo The value of X is "%X%".
复制代码
如果您期望echo下令的效果为
  1. The value of X is "Hello".
复制代码
这是一个可以明白的错误,但毕竟是一个错误。效果是这样的:
  1. The value of X is "".
复制代码
空引号表示X没有设置或设置为null,即什么都没有,乃至没有空格。
注意:
在上一篇文章中,我们提到在下令提示符中,与bat文件相比,语法和输出可能有所不同,这就是一个很好的例子。在下令提示符下输入的相同代码显示效果将不同:
  1. The value of X is "%X%".
复制代码
在后面代码的实行过程中若存在什么非常,我们可以尝试着将代码放入到bat文件中实行试试。
如今上面代码中的set下令并不是那么复杂,它显然想将X设置为文本Hello?此外,它看起来很像其他现代的编程语言中的赋值下令,可以按需要实行赋值。
这是我们第一次出现问题,这个问题的关键是等号前面的空格。变量名以set下令后的第一个非空格字符开始,以赋值操作符或等号之前的字符竣事——无论该字符是什么。因此,这里设置的变量长度为两个字符,X后跟空格:
  1. set X = Hello
  2. echo The value of X-space is "%X %"
复制代码
解析带有尾随空格的变量如今会显示它的值,其中包含一个前导空格:
  1. The value of X-space is " Hello".
复制代码
更容易犯的错误是在值后面的行末端偶然中添加一两个空格。因为仅仅在编辑器中查看文本并不明显,以是很容易忽略它。(在 Notepad++中, 视图--->显示符号--->显示空格与制表符)它将在每行的行尾将空格以点表示,将Tab键以箭头显示。
下令分隔符

&是一种特别字符,用作下令分隔符;它不像简单的文本那样被处理。比方,您可以将多行代码串成一行,每个下令用&字符分隔:
  1. set ;=semicolon& set @=at& set #=hashtag
复制代码
这在功能上等同于三个不偕行的三个下令。
有时,这种技能对于归并简单和类似的下令很有用,但是过度使用它会使代码难以阅读。但是,我发现了下令分隔符的两种非常方便的用法。
向下令追加注释

下令分隔符的一种用途是在行尾添加文本,以便将其视为注释。rem下令根据它后面的文本创建注释。通常,我们将rem下令作为注开释在一些代码前面的行上,但我们也可以使用下令分隔符将其附加到特定下令上。比方,下面两行实行相同的逻辑:
  1. set myMood=reflective
  2. set myMood=reflective& rem This is a thoughtful and contemplative mood.
复制代码
然而,第二举动阅读代码的人提供了更多的信息。
终止下令

下令分隔符的第二个用途是明确地终止下令,以便程序员可以清楚地描述是否存在任何尾随空格。下面的下令是否将变量设置为null、一个空格或多个空格?
  1. set myMood=
复制代码
正如所写的那样,这是不可能的(除非您让编辑器将空格显示为可见字符)。
如果您没有阅读前面的内容,下面的下令可能会将变量设置为&符号:
  1. set myMood=&
复制代码
但是这个下令明确地告诉读者,变量被设置为null,因为语句被紧接在相等操作符之后的&号终止。
同样地,当程序员可能渴望变量具有一定的长度时,也存在这样的实例。下面的下令将变量设置为一个10字节的左对齐值,其中包含文本和三个空格:
  1. set myMood=pensive    &
复制代码
如果没有&符号,就很难确定文本后面有多少空格(如果有的话)。从技能上讲,&号并没有分隔两个下令,但它确实终止了一个下令。
显示变量信息

set下令另有一个更风趣的用法。当不使用等号时,它会写出变量的值,以是如果myMood变量已经界说了,你可以在bat文件中输入这个下令:
  1. set myMood
复制代码
写入控制台的效果输出可能如下所示:
  1. myMood=hopeful
复制代码
如果在set下令后只输入变量名的一部分,则将显示以该文本开头的所有变量。因此,下面的下令可能会输出多于myMood变量的值:
  1. set myM
复制代码
也许,只是也许,它可能输出如下:
  1. Mymar=A Genus of Fairyflies
  2. myMood=hopeful
复制代码
这样的变量不太可能被设置,但是如果它确实存在,并且如果这是机器上以mym开头的仅有的两个变量,那么输出应该是这样的。注意,该下令查找所有变量,而不考虑大小写。还要注意包含嵌入空格的变量值的示例。
在相识了该技能对完备变量名和部分变量名的处理后,我们可以将其扩展到完全没有变量名:
  1. set
复制代码
这个不带参数的下令生成所有可用变量的列表,这些变量是在bat文件启动时加载的,以及来自bat文件自己的对列表的任何添加和修改。
设置变量持久化

set下令本质上是临时的。它在特定批处理流中界说变量,直到变量被重新赋值或脚本终止,此时通过set下令设置的所有变量都消散。但是有时我们渴望变量可以被计算机上的其他进程或其他bat文件访问,并且在原始bat文件终止后很长一段时间内,乃至在计算机关闭并重新启动之后。我们想要的是一个极限聚集下令,我们使用setx下令就是为了这个目的。
假设set和setx下令的语法是相同的,这是合乎逻辑的。除了一个变量、一个等号和一个值,但令人费解的是事实并非云云。setx下令不调用等号。相反,变量名和值由一个或多个空格分隔,如下所示:
  1. setx myMood puzzled
复制代码
在讨论set下令时,很明显变量名和值确实可以包含空格。当在设置变量的下令中使用空格作为分隔符时,显然会出现一种问题。但是将变量名和/或值用双引号括起来可以快速解决问题。下面的下令创建了一个有两个单词名称的变量,并给它赋了一个两个单词的值:
  1. setx "my mood"  "cautiously optimistic"
复制代码
为了测试这一点,起首在一个bat文件中实行前面的语句,然后在另一个bat文件中乃至在下令提示符中实行以下下令:
  1. set my m
复制代码
要查看效果,必须在setx下令完成后启动第二个bat文件或打开下令提示符,因为表明器在会话开始时使用计算机现有的变量加载会话。
将显示所有以my m开头的变量(不区分大小写,包括嵌入的空格),包括变量my mood。除非这个变量被其他进程重新赋值,比如将来的setx下令,否则只要计算机是可操作的,它就会以这个值存在。
setx下令是一个很好的工具,可以资助开发编译后的代码。当开发的特定程序最终在生产环境中运行时,它显然会在具有自己环境变量的不同机器上运行。当运行程序时,一些ide有一个很好的机制来模拟这些环境变量和文件毗连器的设置;令人遗憾的是,其他人没有这些环境。一个很好的解决方案是启动之前在开发机器上设置所有需要的值。
对于用特定语言开发的每个程序,我将创建一个包含一系列setx下令的bat文件,每个下令对应需要持久设置的变量。在实行了bat文件之后,我可以让程序运行起来,它将找到我期望它在稍后的生产环境中实行时找到的所有环境变量。如果我想运行一个不同的程序,我可以先运行与它相干的bat文件,这既快速又容易,如果我觉得需要在完成后将一些变量规复到之前的状态,我也可以为此创建一个bat文件。
下令行资助

我们先容的末了一个批处理下令是记录我已经讨论过的下令以及所有其他下令的下令。help下令接受另一个下令作为其参数,并返回关于该下令的大量信息,起首是对其函数及其一般语法的简要描述。
我将用set下令来演示,因为它是本文的焦点。要调用资助下令,请在下令提示符中输入它(在Windows开始菜单中输入CMD并按enter)。然后,要接收关于set下令的更多具体信息,请输入以下下令:
  1. help set
复制代码
表明器产生了太多关于set下令的信息,下面显示部分信息:
  1. 显示、设置或删除 cmd.exe 环境变量。
  2. SET [variable=[string]]
  3.   variable  指定环境变量名。
  4.   string    指定要指派给变量的一系列字符串。
  5. 要显示当前环境变量,键入不带参数的 SET。
  6. 如果命令扩展被启用,SET 会如下改变:
  7. 可仅用一个变量激活 SET 命令,等号或值不显示所有前缀匹配
  8. SET 命令已使用的名称的所有变量的值。例如:
  9.     SET P
  10. 会显示所有以字母 P 打头的变量
  11. 如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL
  12. 设置成 1。
  13. SET 命令不允许变量名含有等号。
  14. 在 SET 命令中添加了两个新命令行开关:
  15.     SET /A expression
  16.     SET /P variable=[promptString]
复制代码
该下令的简要描述之后紧接着是它的通用语法,它显然是从下令名称自己开始的。方括号内的所有文本都是可选的。文本周围的方括号[variable=[string]]表明该下令可以在有或没有文本的情况下工作。请记住,不带参数的set下令返回所有可用变量的列表。嵌套的方括号更进一步,表明string也是可选的——也就是说,变量可以被设置为什么都没有。
某些下令的资助提供了下令的使用示例,以及附加说明和可用选项列表。选项是分配给下令的设置或调解,用于打开或关闭一些附加功能。它们也被称为开关;事实上,help下令交替使用这两个术语。为了保持一致性,我将只使用更盛行的术语选项,但是如果有人提到批处理下令开关,他们指的是一个选项。
选项通常是用正斜杠加一个字母来界说的,但你最终会遇到一些更复杂的选项。在下令提示符中向下滚动,显示set下令的资助,以查看两个风趣且有用的选项。/A选项允许下令实行算术运算。/P或prompt选项用于设置用户输入数据的变量。
在前面的文章中,可能是你的第一个bat文件包含一个下令来复制一些文件。这里我们不会具体先容xcopy下令,但在前面中,它使用了三个选项(/F、/S和/Y)。它们到底能做什么还不告急。告急的是,它们可以打开或关闭某些功能,并使用资助下令对它们举行记录。
有些下令有很多选项,有些只有几个选项,另有一些没有选项。在先容下令时,我将具体先容我以为告急和有用的选项,但您可能渴望使用help下令来查找更完备的列表。但是,在help下令中找不到一些未记录的选项,要发现这些gem,请访问 https://ss64.com/nt/ 或其他资源。
我建议在第一次使用特定下令时使用资助,大概作为可用选项的提醒。尝试将它用于本文中提到的任何其他下令,乃至资助下令自己。在下令提示符下输入这个:
  1. help help
复制代码
显示help下令的文档。
告急:
跟随任何批处理下令使用/?检索相同的信息。即输入set /?工作方式与资助集相同。以下两个下令都表示查看某个下令的资助信息:
  1. help set
  2. set /?
复制代码
总结

批处理编码可能很复杂,乃至像设置变量这样看似简单的事情也可能有一些细微差异。在本文中,我们具体先容了set下令及其怪异之处,并将其与setx下令举行了比较,后者可以持久地设置变量。您还学习了如何解析变量并在控制台上显示它们。如今,您可以在bat文件中添加注释,将下令分隔符用于多种用途,最告急的是,可以快速访问任何下令的文档。
下一步,我们将进一步讨论变量,特别是变量的作用域。我们将讨论如何界说变量在何时何地拥有某些值,以及如何启用延迟展开的强大功能。
本文由博客一文多发平台 OpenWrite 发布!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

雁过留声

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表