24

我有一个包含&符号的变量,我需要创建另一个包含第一个变量的变量。我知道“&”字符可以用 carret (^) 转义,但我不知道如何转义变量内的文本。

set Name1 = Red ^& Green
set Name2 = %Name1% ^& Blue

'Green' 不是内部或外部命令、可运行程序或批处理文件。

我什至无法“回显”包含&符号的变量 - 我得到同样的错误。

我需要使用变量来将它们的内容输入到输出中或操作由变量命名的文件,例如

type "%Name1%.txt"
type "%Name2%.txt"
4

4 回答 4

25

最简单的解决方案是使用引号进行赋值,并延迟扩展。这消除了任何逃避的需要。

@echo off
setlocal enableDelayedExpansion
set "Name1=Red & Green"
set "Name2=!Name1! & Blue"
echo !Name2!

如果您混合了带引号和不带引号的文本,则有时必须转义某些字符。但这仅在初始分配时才需要。使用延迟扩展时,变量的内容永远不需要转义。

@echo off
setlocal enableDelayedExpansion
set var="This & that" ^& the other thing.
echo !var!
于 2013-01-01T07:38:24.227 回答
9

不幸的是,您将不得不双重转义与符号,因为它被评估两次或将变量值放在引号中。

set Name1=Red ^^^& Green
set Name2=%Name1% ^& Blue

但是您还需要在使用 Name2 时添加另一组转义。这将是一个主要的痛苦。

set Name1=Red ^^^^^& Green
set Name2=%Name1% ^^^& Blue

或使用报价(推荐)

set "Name1=Red ^& Green"
set "Name2=%Name1% ^& Blue"
于 2013-01-01T05:19:24.467 回答
0

我想到了两种解决方案,这两种解决方案都不够通用,但它们都“有效”:

  1. 如前一个解决方案中所述,始终将内容放在引号中并在需要时将其删除。
  2. 重新引用 &'s: set name2=%name1:&=^&% ^& Blue
于 2013-01-01T06:22:05.170 回答
-2

最简单的解决方案是这个:

for /f "delims= usebackq" %a in (`echo "First & ? * Last"`) do echo # %~a

...在批处理脚本中:

for /f "delims= usebackq" %%a in (`echo "First & ? * Last"`) do echo # %%~a

或者

for /f "delims= usebackq" %%a in (`echo "%~1"`) do echo # %%~a
于 2017-05-19T11:58:22.937 回答