逃避变量中的&符号 - 赢得批量

时间:2013-01-01 05:10:44

标签: windows batch-file escaping

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

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

'绿色'不被识别为内部或外部命令,可操作程序或批处理文件。

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

我需要使用变量才能将其内容输入到输出或操作由变量命名的文件,如

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

4 个答案:

答案 0 :(得分:20)

最简单的解决方案是使用引号进行分配和延迟扩展。这消除了任何转义的需要。

@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!

答案 1 :(得分:7)

不幸的是,由于它被评估两次或者将变量值放在引号中,所以你必须双倍转义&符号。

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"

答案 2 :(得分:0)

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

  1. 始终将内容保留在引号中并在需要时将其删除,如上一个解决方案中所述。
  2. 重新引用& s: set name2 =%name1:& = ^&%^&蓝色

答案 3 :(得分:-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