編集
次の条件がすべて当てはまる場合、最初の試みは失敗します。
: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
これが私の防弾2回目の試みです
この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
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