为什么在cmd中使用“set var = text”命令后没有“echo %var%”字符串输出? [复制]

2023-12-09

我在 cmd 中设置了一个变量set命令,并尝试echo it.

这是一个例子:

C:\Users\Logan>set var = text

C:\Users\Logan>set var
var = text

C:\Users\Logan>echo %var%
%var%

C:\Users\Logan>

有没有办法强制cmdecho变量而不是原始文本?


将值/字符串分配给环境变量

最好使用以下语法并启用命令扩展来定义或修改环境变量:

set "var=text"

命令是set参数是"variable=value".

只要默认启用命令扩展,参数字符串就可以像所有命令一样用双引号引起来。

如果周围没有使用双引号variable=value, 命令set将第一个等号之后的所有内容解释为行尾,包括行尾不可见的空格和水平制表符作为要分配给变量的字符串值。

变量的名称以第一个非空白字符开头(如果使用双引号,则在双引号之后),并以左到第一个等号结束。分配给变量的值从第一个等号右侧开始,到行尾或最后一个双引号结束。

set VAR = TEXT

The command line above creates an environment variable with name VARSpace and assigns the string SpaceTEXT to this variable.

的用法

set var="text"

通常不正确,因为这会导致分配给变量var包含引号以及所有尾随空格和制表符的文本。现在参考var在另一条带有引号的代码行上通常会导致错误消息,因为变量本身保存着已经带有引号的文本。欲了解更多详情,请参阅答案如何设置带空格的环境变量?

Example:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "var=text"
set "var = text"
set "var1=and more text"
set var2="and more text"
set var3="text with 1 trailing space" 
set var
echo var3=%var3%^<- Do you see the trailing space?
echo/
set UnwantedSpaceVar=Hello 
echo %UnwantedSpaceVar%! ^<- Where does the space come from?
echo/
echo There is a trailing space after Hello in this code snippet.
echo/
set "TrailingSpacesIgnored=Hi"   
echo %TrailingSpacesIgnored%! ^<- The 3 trailing spaces above are ignored.
echo/
endlocal
pause

运行这个小批量代码会产生以下输出:

var=text
var = text
var1=and more text
var2="and more text"
var3="text with 1 trailing space" 
var3="text with 1 trailing space" <- Do you see the trailing space?

Hello ! <- Where does the space come from?

There is a trailing space after Hello in this code snippet.

Hi! <- The 3 trailing spaces above are ignored.

封闭variable=value即使文本本身包含 1 个或多个双引号,也可以使用引号。

set "Quote=""

这一行定义了变量Quote与价值"。命令set将第一个等号到最后一个双引号之后的所有内容解释为分配给名称位于第一个引号和第一个等号之间的变量的值。

Note:一个字符串值"里面和下一个& or && or ||甚至可以使用set "variable=value"被误解并因此导致意外行为,因为可以在运行包含以下两行的批处理文件时看到:

@echo off
set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!"

Value with one double quote in the middle" & echo Oh, there is something wrong here!是要分配给环境变量的字符串,但分配给变量只是Value with one double quote in the middle以及之后的其余行"中间和之后&解释为条件运算符,而不是字面上解释为要执行的附加命令cmd.exe。同样的问题存在于&& or ||之后"之间有 0 个或多个空格/制表符。这个问题不是由命令引起的set。这是由 Windows 命令处理器引起的,它将行分成命令行set还有一个命令行echo with 条件执行 of the echo命令行。

禁用命令扩展的变量赋值

命令语法set "variable=value"如果命令扩展被禁用,则无法使用setlocal DisableExtensions在批处理文件中(或者在 Windows 注册表中,这是非常罕见的,我从未在任何 Windows 计算机上见过)。执行批处理文件时会出现语法错误。

只能使用set variable=value禁用命令扩展,其中值还可以包含双引号,并且必须注意尾随空格/制表符,因为它们也被分配给环境变量。

在命令提示符窗口中运行cmd /? and setlocal /?有关命令扩展以及哪些命令受命令扩展影响的更多信息。注意:受影响命令的输出列表丢失exit如答案中所述GOTO :EOF 返回到哪里?

通过算术表达式进行变量赋值

使用命令set有选项/A完全改变了第二个参数的解析,即后面的字符串set /A。有选项/A作为第一个参数,第二个字符串被解释为算术表达式因此,处理方式与将字符串值分配给环境变量完全不同。环境变量始终是字符串类型,而不是整数类型。

选项的使用/A需要启用命令扩展,否则命令set完全忽略该行的其余部分,没有任何错误消息。

在大多数情况下,不建议仅使用算术表达式将数字分配给环境变量,即使用set /A var=1. set "var=1"要不就set var=1(并且没有尾随空格)速度要快一些,因为环境变量始终是字符串类型。

In an arithmetic expression whitespaces are interpreted as delimiters for variable names, numbers and operators. For that reason the command line set /A var = 1 does not define a variable with name VARSpace with the string Space1 as set var = 1 does. set /A var = 1 defines a variable with name VAR with string value 1 after converting 1 from string (batch file contains 1 as character with hexadecimal code value 31) to integer with value 1 and back to a string with the two values 0x31 and 0x00 (string terminating null).

通过提示进行变量赋值

也可以使用命令set有选项/P改变了解析 变量名和等号后的字符串。变量名称和等号后面的字符串被解释为要输出的提示文本,而不是分配给环境变量的字符串。

The environment variable gets assigned the string entered by prompted user (or redirected from a file or command/application), or in case of user does not enter anything before pressing RETURN or ENTER, keeps its current value respectively is still undefined if not defined before the prompt.

选项的使用/P需要启用命令扩展,否则命令set完全忽略该行的其余部分,没有任何错误消息。

提示用户输入字符串最常用的语法是:

set /P var="Please enter something: "

命令set在这种情况下,在打印处理之前自动删除提示文本周围的双引号STDOUT(如果未重定向,则控制台窗口)。

但工作也是:

set /P "var=Please enter something: "

请阅读这个答案有关提示文本解析以及如何输出带有双引号的提示文本的更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在cmd中使用“set var = text”命令后没有“echo %var%”字符串输出? [复制] 的相关文章

随机推荐

  • for(;;) 是什么意思?

    我很困惑for 构造 我认为这是无限 for 循环的一种简写形式 但我不能确定 这是代码 for whatever statements Your guess is correct it s an infinite loop This is
  • 为什么此 Firestore 事务冻结?

    下面的简单代码冻结了 要重现 只需替换this firestoreProvider with admin initializeApp firestore console log Init the cat const kittyRef thi
  • 操作栏检测片段中的后退按钮单击

    我有一个片段 其中启用了操作栏后退按钮 Code Override public void onAttach Activity activity super onAttach activity setHasOptionsMenu true
  • 使用另一个java程序编译一个java程序

    我想制作一个java程序 从文件中读取另一个java程序 编译它并显示错误和警告 我还想显示从文件读取并编译的程序的输出 我怎样才能做到这一点 看一眼javax tools JavaCompiler 从程序调用 Java 编程语言编译器的接
  • 如果清单 v3 中不允许当前选项卡 url,则阻止弹出窗口

    我正在编写一个 chrome 扩展 我想完全禁用弹出窗口 或者在 v3 清单不允许当前选项卡的 url 时显示一条消息host permissions财产 这是一个开发支持工具 我们不希望为生产 URL 启用它 所以如果我设置 host p
  • 将内容放入 HttpResponseMessage 对象中?

    几个月前 微软决定更改 HttpResponseMessage 类 以前 您可以简单地将数据类型传递到构造函数中 然后使用该数据返回消息 但现在不行了 现在 您需要使用 Content 属性来设置消息的内容 问题是它是 HttpConten
  • 如何将十六进制序列毫无歧义地转换为汇编语言?

    8B EC 56 8B F4 68 00 70 40 00 FF 15 BC 82 40 像上面这样的序列可以通过多种方式进行分段 每个段都可以翻译为相应的汇编指令 但是每个二进制可执行文件都有其唯一的确定的汇编 避免歧义的数学原理是什么
  • 核心动画围绕任意点旋转图层

    如何使用核心动画围绕任意点旋转图层 在我的例子中 一个点不在我想要旋转的图层内部 我更喜欢在不更改锚点的情况下执行此操作 因为除非每次更改锚点时出现错误 否则它也会更改图层的位置 我尝试了类似的方法 但没有成功 UIImageView be
  • strtol 使用 errno

    我有以下代码 include
  • 方法 findViewById(int) 未定义

    我是 Android 开发新手 我正在尝试编写一个小应用程序 它允许我获取外部 JSON 文件并解析它 我让它工作了 但是如果我尝试在后台执行它 它就不会工作AsyncTask Eclipse 给我错误 对于 LongOperation 类
  • 如何清除tomcat中的PermGen space错误

    我在 Windows 环境中工作 每次使用 tomcat 时都会收到此错误 Apr 30 2012 5 30 37 PM org apache catalina core StandardWrapperValve invoke SEVERE
  • 在 Java 中读取奇怪的 unicode 字符?

    我有以下文本文件 文件以utf 8编码保存 我使用以下代码来读取文件的内容 FileReader fr new FileReader f txt BufferedReader br new BufferedReader fr String
  • Canvas for Node.js 在本地工作但不能在 Heroku 服务器上工作

    我正在使用帆布包对于 Node js 它在我的计算机上运行良好 但当我将其上传到我的 Heroku 服务器时 它不起作用 我所说的 工作正常 是指画布包已正确安装npm install canvasNode js 应用程序按预期工作 但是
  • JTable 不使用 CTRL 进行多选

    我正在尝试更改 JTable 的选择行为 以便能够在不使用 CTRL 修饰符的情况下向选择添加和删除行 方法 public void changeSelection int rowIndex int columnIndex boolean
  • 使用VBA从PPT中提取文本并将其粘贴到Excel中

    我需要从 PowerPoint 演示文稿中的文本框中提取数据 并将它们放入 Excel 工作表中的相应单元格中 我已经搜索过但找不到合适的解决方法 此代码用于打印幻灯片中的文本 我不明白如何在 Excel 单元格中排列它 Dim oPApp
  • 从 neo4j 中删除标签引用

    在从电子表格导入大量数据时 我尝试使用标签约定 其中节点大写 如 This 关系标签标记为 THIS 在一个例子中 我不小心对一组节点使用了关系标签格式 然后我删除了这些节点并使用正确的标签格式重新导入它们 附带问题 有没有办法重命名我没有
  • 地点详细信息 API 的短名称的更改

    Google 响应的格式是否发生变化 几天以来 当我使用与国家 地区对应的 place id 参数查询 API 时 我不再获得任何国家 地区代码 alpha2 例如 Query for France http maps googleapis
  • 线程处理时文本框不会更新

    这是名为 Blahing 的模块内的子代码 Sub BlahBlah ByVal Count As Long For i As Long 0 To Count frmBlaher txtBlah Appendtext Blah Next E
  • 用波浪边框 SVG 路径填充 div

    我想填写 div 使用颜色并向边框添加阴影 但我的代码正在执行此操作 我实际上需要它 如图所示 div
  • 为什么在cmd中使用“set var = text”命令后没有“echo %var%”字符串输出? [复制]

    这个问题在这里已经有答案了 我在 cmd 中设置了一个变量set命令 并尝试echo it 这是一个例子 C Users Logan gt set var text C Users Logan gt set var var text C U