【问题标题】:How to escape special characters on batch file when setting variable设置变量时如何转义批处理文件上的特殊字符
【发布时间】:2019-12-07 06:13:36
【问题描述】:

我需要在批处理脚本中使用字符串 !5[4U}~YfWWre"4a 设置一个变量。我知道我必须在那里转义一些特殊字符,但我不能不太对。

我的延迟变量扩展是开启的,并且基于https://www.robvanderwoude.com/escapechars.php,我尝试了这个:

  • SET PASS=^^!5[4U}~YfWWre"4a
  • SET PASS=^^!5[4U}~YfWWre"4a
  • SET PASS=^^!5[4U}~YfWWre""4a
  • SET "PASS=!5[4U}~YfWWre"4a"
  • SET "PASS=^^!5[4U}~YfWWre"4a"
  • SET "PASS=^^!5[4U}~YfWWre""4a"

没有一个对我有用。我究竟做错了什么?

【问题讨论】:

  • 当delayed expansion被禁用启用时设置变量并在以后需要时启用它...

标签: windows batch-file escaping


【解决方案1】:
@ECHO OFF
SETLOCAL

SET "var=!5[4U}~YfWWre"4a"
ECHO var=%var%
SET var
GOTO :EOF

对我来说效果很好......但你使用的是delayedexpansion所以

@ECHO OFF
SETLOCAL enabledelayedexpansion

SET "var=^!5[4U}~YfWWre"4a"
ECHO var=%var%
SET var
GOTO :EOF

这表明这完全取决于您显示字符串的方式。

@ECHO OFF
SETLOCAL enabledelayedexpansion
SETLOCAL disabledelayedexpansion
SET "var=!5[4U}~YfWWre"4a"
ECHO var=%var%
SET var
endlocal&SET "var=%var:!=^!%"
ECHO var=%var%
SET var

GOTO :EOF

展示了同样的现象——如果字符串包含多个!,如!5[4U}~!YfWWre"4a,则评估字符串的echo与不评估字符串的set之间的差异更大。

所以快速回答是 - 使用该值时返回 disabledelayedexpansion 模式。

【讨论】:

  • 这行得通,但我必须再次启用延迟扩展吗?还是只是在运行时启用?
  • 执行endlocal 指令会将环境完全恢复到之前执行setlocal 时的状态,包括delayedexpansion 状态。它还将所有环境变量值恢复为当时的状态。 endlocal&set var=%var% 是一个解析技巧,它允许将更改的环境变量导出到边界上。 是可以使用setlocal 作为开关并在delayedexpansion 模式之间切换 - 但它被设计用于“框架”setlocal...endlocal,因此限制为 32 个嵌套 @ 987654337@s 可以这样用。
猜你喜欢
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多