如何在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%
答案 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
不再是一个特殊的角色。第二个解析阶段使用%
作为替换。
然后您只需要将修改后的变量返回到原始上下文。