Batch file 有没有办法从字符串中除去字母和数字以外的所有字符?

Batch file 有没有办法从字符串中除去字母和数字以外的所有字符?,batch-file,Batch File,我想确定是否有一种方法可以从%variable%中删除除字母和数字(以及空格)以外的所有字符?希望不要删除每个字符,而是选择要保留的字符,因为这可能是一项更简单的任务。如果您试图从字符串中删除某些符号或字符,我们可以使用带有/V开关的findstr从语句中排除这些变量 这样做的问题是,它会在station中看到charecter并将其一起移除。为了解决这个问题,一系列的for语句可以分解字符串,并通过编程创建一系列findstar命令来自动禁止所需的字符 例如,下面的命令将从aa、B、C、D格式

我想确定是否有一种方法可以从
%variable%
中删除除字母和数字(以及空格)以外的所有字符?希望不要删除每个字符,而是选择要保留的字符,因为这可能是一项更简单的任务。

如果您试图从字符串中删除某些符号或字符,我们可以使用带有
/V
开关的
findstr
从语句中排除这些变量

这样做的问题是,它会在station中看到charecter并将其一起移除。为了解决这个问题,一系列的for语句可以分解字符串,并通过编程创建一系列findstar命令来自动禁止所需的字符

例如,下面的命令将从a
a、B、C、D
格式获取字符,并为每个“禁止”字符创建一个
^ find/V“a”
+
^ find/V“B”
+
^ find/V“C”
^ find/V“D”字符串

for /F "delims=" %%a in ("%BAN%") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ","^| find /V "*"') do (
        set "output=!output! | find /V "%%b""
    )
    set "B1=!output:~1!"
)
从这里,我们可以使用这些数据并将其输入另一个for语句中,以排除
findstr/V
中的数据。请记住,每个块在其自己的行上打断每个字符,以便稍后在块中添加回一行

可以使用带有
%1
call
语句调用整个过程。在我的解决方案中,您所需要做的就是使用
CALL:FIX(STRING NAME)
,它将遍历、删除禁止的字符,并将该字符串更改为不包含这些字符

@ECHO OFF
setlocal EnableDelayedExpansion

rem | Banned character List (Must be in A,B,C format)
set "BAN=m,1,4,)"

rem | TEST strings we want to remove symbols from (Can be any name)
SET "STRING1=H$4jm)k@14+d^j"
SET "STRING2=money"

rem | Use (CALL) (:FIX) (STRING NAME)
echo BEFORE FIX: %STRING1%
call :FIX STRING1
echo AFTER FIX: %STRING1%

pause
goto :eof

:FIX
Rem | Create %1 into raw string & string data
set "VAR1=%1"

Rem | Create a Findstr for each banned character
for /F "delims=" %%a in ("%BAN%") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ","') do (
        set "output=!output! | find /V "%%b""
    )
    set "B1=!output:~1!"
)

Rem | Edit string without banned words
for /F "delims=" %%a in ("!%VAR1%!") do (
    set "output="
    for /F "delims=" %%b in ('cmd /U /C echo %%a^| find /V ""!B1!') do (
        set "output=!output! %%b"
    )
    set "B2=!output:~1!"
)
Rem | Remove spaces & finish
set %VAR1%=!B2: =%!
goto :eof

这里的问题是字符串必须逐个字符处理。我们可能会使用一个有趣的技巧来分隔字符串中的每个字符。该方法包括使用
/U
开关运行一个单独的
cmd.exe
实例,因此每个字符后面都有一个二进制零。然后,使用
find/V”“
命令将每个字符零对作为单独的行

最后,只需检查字符是否在
keep
变量中,否则忽略。该方法还检查不能在字符串替换中直接处理的特殊字符:
=*

@echo off
setlocal EnableDelayedExpansion

set "input=Any ^!string#& /with ()=special*{ }characters..."
echo Input:  "!input!"

set "keep=abcdefghijklmnopqrstuvwxyz 0123456789"
set "output="
for /F "delims=" %%a in ('cmd /U /C set /P "=!input!" ^<NUL ^| find /V ""') do (
   if "%%a" neq "^!" if "%%a" neq "=" if "%%a" neq "*" (
      if "!keep:%%a=!" neq "%keep%" (
         set "output=!output!%%a"
      )
   )
)

echo Output: "%output%"

我在keep变量中添加了
ä
ö
,但这两个字符都没有保留。可能有什么问题?我在脚本开始时使用了
chcp 65001
,如果这很重要的话。
Input:  "Any !string#& /with ()=special*{ }characters..."
Output: "Any string with special characters"