编辑
如果以下所有条件都为真,我的第一次尝试将失败:
:StripSymbols
在启用延迟扩展时调用
- 字符串很长,需要多次迭代
- 第一次迭代后,字符串至少有 2 个
!
剩余,中间有非符号
第一次尝试通常很快,但对于需要多次迭代的病态病例可能会大大减慢。
@echo off
setlocal disableDelayedExpansion
set "test1=!Hello`@#$%%^&()_-+{[}]|\:;'<,>.?/"~*= World!"
call :test test1
set "test2="
call :test test2
set "test3=`@#$%%^&()_-+{[}]|\:;'<,>.?/"~*=!"
call :test test3
set "test4=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9,"
call :test test4
exit /b
:test StrVar
setlocal enableDelayedExpansion
echo Before: %~1=!%~1!
call :stripSymbols %1
echo After: %~1=!%~1!
echo(
exit /b
:stripSymbols StrVar
setlocal enableDelayedExpansion
for /f tokens^=1-25*^ delims^=`@#$%%^^^&()_-+{[}]^|\:^;'^<^,^>.?/~*^=!^" %%A in ("a,!%~1!") do (
endlocal
set "%~1=%%B%%C%%D%%E%%F%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z"
if "%%Z" neq "" goto :stripSymbols
)
exit /b
以下是测试结果。注意 test5 是如何失败的。
Before: test1=!Hello`@#$%^&()_-+{[}]|\:;'<,>.?/"~*= World!
After: test1=Hello World
Before: test2=
After: test2=
Before: test3=`@#$%^&()_-+{[}]|\:;'<,>.?/"~*=!
After: test3=
Before: test4=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9,
After: test4=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Before: test5=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z!0,1,2,3,4,5,6,7,8,9!
After: test5=ABCDEFGHIJKLMNOPQRSTUVWXYZ
这是我的防弹第二次尝试
这第二次尝试应该总是很快,也应该是防弹的
@echo off
setlocal disableDelayedExpansion
set "test1=!Hello`@#$%%^&()_-+{[}]|\:;'<,>.?/"~*= World!"
call :test test1
set "test2="
call :test test2
set "test3=`@#$%%^&()_-+{[}]|\:;'<,>.?/"~*=!"
call :test test3
set "test4=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9,"
call :test test4
set "test5=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z!0,1,2,3,4,5,6,7,8,9!"
call :test test5
exit /b
:test StrVar
setlocal enableDelayedExpansion
echo Before: %~1=!%~1!
call :stripSymbols %1
echo After: %~1=!%~1!
echo(
exit /b
:stripSymbols StrVar
setlocal enableDelayedExpansion
set "str=!%~1!"
setlocal disableDelayedExpansion
for /l %%N in (1 1 171) do (
setlocal enableDelayedExpansion
for /f tokens^=1-25*^ delims^=`@#$%%^^^&(^)_-+{[}]^|\:^;'^<^,^>.?/~*^=!^" %%A in ("a,!str!") do (
endlocal
set "str=%%B%%C%%D%%E%%F%%G%%H%%I%%J%%K%%L%%M%%N%%O%%P%%Q%%R%%S%%T%%U%%V%%W%%X%%Y%%Z"
if "%%Z" equ "" goto :break
)
)
:break
endlocal & endlocal & set "%~1=%str%"
exit /b
这是修正后的结果
Before: test1=!Hello`@#$%^&()_-+{[}]|\:;'<,>.?/"~*= World!
After: test1=Hello World
Before: test2=
After: test2=
Before: test3=`@#$%^&()_-+{[}]|\:;'<,>.?/"~*=!
After: test3=
Before: test4=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,0,1,2,3,4,5,6,7,8,9,
After: test4=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Before: test5=,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z!0,1,2,3,4,5,6,7,8,9!
After: test5=ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789