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

Bea*_*ode 19 windows escaping batch-file

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

set Name1 = Red ^& Green
set Name2 = %Name1% ^& Blue
Run Code Online (Sandbox Code Playgroud)

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

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

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

type "%Name1%.txt"
type "%Name2%.txt"
Run Code Online (Sandbox Code Playgroud)

dbe*_*ham 20

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

@echo off
setlocal enableDelayedExpansion
set "Name1=Red & Green"
set "Name2=!Name1! & Blue"
echo !Name2!
Run Code Online (Sandbox Code Playgroud)

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

@echo off
setlocal enableDelayedExpansion
set var="This & that" ^& the other thing.
echo !var!
Run Code Online (Sandbox Code Playgroud)

  • @Binarus - 在 `set "Name2=...` 语句中不需要它,但也不会导致问题。由于引号,`"set Name2=%Name1% & Blue"` 也可以正常工作。 `echo !Name2!` 中需要延迟扩展来保护 `&` 字符。如果启用延迟扩展并且变量值可能包含 `!`,则应始终使用 `!var!` 而不是 `%var% ` 否则 `!` 将从内容中删除。 (3认同)

Dav*_*ann 7

不幸的是,由于它被评估两次或者将变量值放在引号中,因此您必须双重转义&符号.

set Name1=Red ^^^& Green
set Name2=%Name1% ^& Blue
Run Code Online (Sandbox Code Playgroud)

但是,当使用Name2时,您还需要添加另一组转义.这将成为一个重大的痛苦.

set Name1=Red ^^^^^& Green
set Name2=%Name1% ^^^& Blue
Run Code Online (Sandbox Code Playgroud)

或使用报价(推荐)

set "Name1=Red ^& Green"
set "Name2=%Name1% ^& Blue"
Run Code Online (Sandbox Code Playgroud)