如何使用findstr排除Batch中特殊字符的输入?

How to exclude the input of special characters in Batch using findstr?

我正在编写 Batch 游戏,但遇到了一些困难。我正在创建一个角色,玩家可以输入他们选择的名字。我正在尝试使用 findstr 命令检测他们是否输入了特殊字符。我一直在四处寻找,但该网站上的所有其他修复程序都对我不起作用。我在批处理方面不是很先进,所以最好是一个简单的答案,否则将不胜感激详细的解释。启用延迟扩展。 这是我的代码。

:charactername
cls
echo We know your Username is !username!, but what will your character's name be?
echo.
set /p character="Type a character name.> "
if "!character!"=="" (
    echo Please type a valid name.
    timeout 3 /nobreak > nul
    goto charactername
)
echo !character! | findstr /R " ^^! @ # $ %% ^ && * ) ( _ = + \] \[ } { \ | ; : "" < > ^, \. / ? ^` ~ 1 2 3 4 5 6 7 8 9 0" 2>nul
if %errorlevel%==0 (
    cls
    echo Please do not use any special characters or numbers for your character's name.
    echo Only - and ' are accepted.
    timeout 5 /nobreak > nul
    goto charactername
) else (
    goto nameconfirm
)

这是我希望每个部分做的。

if "!character!"=="" 检测玩家是否未输入任何内容。这工作正常。

echo !character! | findstr /R " ^^! @ # $ %% ^ && * ) ( _ = + \] \[ } { \ | ; : "" < > ^, \. / ? ^` ~ 1 2 3 4 5 6 7 8 9 0" 2>nul :我希望此部分检测玩家是否输入了这些字符中的任何一个。我不确定这个命令的格式是否正确;请指教

if %errorlevel%==0 :根据我对 Whosebug 的其他研究,显然我可以使用它来检测 findstr 命令是否找到任何特殊字符。我也尝试过使用 if %errorlevel%==1。这里的问题是,如果我使用第一个选项,它会跳到 else 部分,而不考虑特殊字符。如果我检测错误级别是否为 1,它不允许任何内容通过,显示我写的错误消息。

一种选择是使用 FOR /F 命令并使用字母表中的所有字符作为分隔符。如果 FOR 命令输出任何数据,那么您就知道它们不只使用字母字符。

for /F "delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" %%G IN ("%character%") Do IF NOT "%%~G"=="" @ECHO Bad Character Name