如何在Windows批处理中转义特殊字符?

时间:2017-12-01 07:03:04

标签: batch-file

如何在Windows批处理文件中用1234567890替换字符串!@#$%^&*()

set temp_mm=1234567890
echo befor:%temp_mm%

set temp_mm=%temp_mm:1=!%
set temp_mm=%temp_mm:2=@%
set temp_mm=%temp_mm:3=#%
set temp_mm=%temp_mm:4=$%
set temp_mm=%temp_mm:5=^%%
set temp_mm=%temp_mm:6=^^%
set temp_mm=%temp_mm:7=^&%
set temp_mm=%temp_mm:8=^*%
set temp_mm=%temp_mm:9=^(%
set temp_mm=%temp_mm:0=^)%

echo after:%temp_mm%

1 个答案:

答案 0 :(得分:1)

@ECHO Off
SETLOCAL
set temp_mm=12345678901234567890
echo befor:%temp_mm%

set "temp_mm=%temp_mm:1=!%"
set "temp_mm=%temp_mm:2=@%"
set "temp_mm=%temp_mm:3=#%"
set "temp_mm=%temp_mm:4=$%"
set "temp_mm=%temp_mm:6=^%"
set "temp_mm=%temp_mm:7=&%"
set "temp_mm=%temp_mm:8=*%"
set "temp_mm=%temp_mm:9=(%"
set "temp_mm=%temp_mm:0=)%"
SETLOCAL enabledelayedexpansion
 FOR %%a IN (%%) DO set "temp_mm=!temp_mm:5=%%a!"
ENDLOCAL&SET "temp_mm=%temp_mm%"

echo after:"%temp_mm%"
SET temp_

GOTO :EOF

您的帖子中似乎有非ANSI字符。

就个人而言,我使用sed,因为实际使用这样转换的变量可能会有问题。

替换构造以指定的字符串为目标,并用第二个字符串替换它。对于大多数角色来说,这一切都很好,但对于某些特殊内容(如%)则失败,因为语法不区分%是替换字符(即使被正常{{1}转义}}和%。 “temp_mm =%temp_mm:a = %%”和“temp_mm =%temp_mm:a = %%%”的语法不明确 - 是end-of-replacement-string还是replace with "%"还是replace with escaped "%"

通过使用replace with *nothing*, then add "%", "escaped-%" or "%%"括号,您可以使用两阶段替换,第一阶段将替换字符串设置为setlocal/endlocal,因为它是%的内容,但是初始解析然后完成,%%a不再是一个特殊的角色。第二个解析阶段使用%作为替换。

然后您只需要将修改后的变量返回到原始上下文。