1

たとえば、この変数 %s% があり、すべてのシンボルを削除する必要があるとしましょう。これらのシンボルはコードに干渉するためです..これらのシンボルには次のものが含まれます:

~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/

基本的に、私が考えられるすべての記号は、どのように入力すればよいのでしょうか? 次のコードは大失敗でした

SET s=!s:"^~"=""!
SET s=!s:"`"=""!
SET s=!s:"^!"=""!
SET s=!s:"@"=""!
SET s=!s:"#"=""!
SET s=!s:"^$"=""!
SET s=!s:"^%"=""!
SET s=!s:"^^"=""!
SET s=!s:"&"=""!
SET s=!s:"*"=""!
SET s=!s:"("=""!
SET s=!s:")"=""!
SET s=!s:"-"=""!
SET s=!s:"_"=""!
SET s=!s:"+"=""!
SET s=!s:"="=""!
SET s=!s:"{"=""!
SET s=!s:"}"=""!
SET s=!s:"["=""!
SET s=!s:"]"=""!
SET s=!s:"^|"=""!
SET s=!s:"\"=""!
SET s=!s:":"=""!
SET s=!s:";"=""!
SET s=!s:"'"=""!
SET s=!s:'"'=""!
SET s=!s:"<"=""!
SET s=!s:","=""!
SET s=!s:">"=""!
SET s=!s:"."=""!
SET s=!s:"?"=""!
SET s=!s:"/"=""!

私はインターネットを精査しましたが、何も見つかりませんでした。何かアイデアはありますか?

4

3 に答える 3

2

最初のステップはこれで、badChars-listからすべての文字と感嘆符を削除します。
ただし、~*=この方法で文字を置き換えることはできません。

set "str=Hello,;:$%%!&<>x"
setlocal EnableDelayedExpansion

set "badChars=`@#$%%^&()_-+{[}]|\:;'<,>.?/""
for /L %%n in (0,1,30) do (
  for /f "eol=A delims=" %%C in ("!badChars:~%%n,1!") DO (
    if defined str set "str=!str:%%C=!"
  )
)
set "str=%str:!=%"
echo(!str!
于 2013-01-09T19:52:11.530 に答える
2

このコードを自分でテストしたことはありませんが、しばらくの間、これをブックマークとして持っていました。

このスレッドの投稿 #7を参照してくださいhttp://forums.techguy.org/dos-other/823979-solved-removing-special-characters-loop.html

:_GetName
SET /P folder=Folder Name:
Set folder="%folder:"=%"
Setlocal EnableDelayedExpansion
For %%I In (^| ^& ^< ^> ^^ + ^( ^) \ / . @ # $ { } [ ] ' : ` ^%% ^") Do Set folder=!folder:%%I=!
:: Now remove any !
SetLocal DisableDelayedExpansion
Set folder="%folder:!=%"
EndLocal&Set folder=%folder:~1,-1%
:_parse
Set _Flag1=
For /F "Tokens=1* Delims=~=*;,?" %%J In ('Echo !folder!') Do (
    Set folder=%%J%%K
    Set _Flag1=%%J
    Set _Flag2=%%K
)
If NOT "%_Flag2%"=="" Goto _parse
If Not Defined _Flag1 Echo None of the characters you entered are valid. Please try again&Goto _GetName
:: Now revert to previous settings. The Set is needed to pass the
:: Folder variable back to the previous environment
EndLocal&Set folder=%folder%
Echo You said your folder name will be %folder%.
@pause
于 2013-01-09T21:22:31.970 に答える
1

編集
次の条件がすべて当てはまる場合、最初の試みは失敗します。

  • :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
于 2013-01-09T23:19:44.353 に答える