如何从 bat 脚本中的字符串中删除非 ASCII 字符?

如何从 bat 脚本中的字符串中删除非 ASCII 字符?

有时%COMPUTERNAME%变量值包含非 ASCII 字符,但是当我在批处理脚本中使用此变量时,我只需要保留相关值的 ASCII 字符。

如何使用批处理脚本获取包含非 ASCII 字符的字符串值以便仅显示 ASCII 字符?

答案1

您可以使用以下列出的一些方法使用正则表达式(Regex)从字符串中删除特殊字符使用如下的批处理脚本为例。

只需使用 Windows 的原生功能即可微软只需在批处理脚本中使用 PowerShell 设置%computername%PowerShell 命令返回的非 ASCII 字符即可完成此作业。


删除非 ASCII 字符的批处理脚本

SET PCName=请确保在脚本中相应地设置变量,以便与您的逻辑已经起作用的方式相结合(例如SET PCName=%computername%,等等)

您可以将其设置为,而不是使用下面脚本中的循环,DO ECHO %%~F然后可以将变量合并到其余批处理脚本逻辑中,并且它始终是变量值,但仅仅是 ASCII 字符。FOR /FDO SET PCNameASCII=%%~F%PCNameASCII%%ComputerName%

@ECHO ON

SET PCName=Laäff¥yTaäffi¡

SET PSScript=%Temp%\~tmpRemovenonascii.ps1
IF EXIST "%PSScript%" DEL /Q /F "%PSScript%"

ECHO $String = '%PCName%'                                             >>"%PSScript%"
ECHO $String = $String -replace '[^^\x30-\x39\x41-\x5A\x61-\x7A]+', ''>>"%PSScript%"
ECHO ECHO $String                                                     >>"%PSScript%"

SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0
CD /D "%PowerShellDir%"
FOR /F "TOKENS=*" %%F IN ('Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'"') DO ECHO %%~F

PAUSE

GOTO EOF

查看更多资源部分及其中的注释,了解使用 Regex 删除特殊字符等的其他方法。


之前(非 ASCII)

LaõffÑyTaõffií

之后(结果)

LaffyTaffi

更多资源

  • 代替()
  • 为/F
  • 使用正则表达式(Regex)从字符串中删除特殊字符

  • # Regular Expression - Using the \W (opposite of \w) 
    $String -replace '[\W]', ''
    
    # Regular Expression - Using characters from a-z, A-Z, 0-9 
    $String -replace '[^a-zA-Z0-9]', ''
    
    # Regular Expression - Using ASCII 
    $String -replace '[^\x30-\x39\x41-\x5A\x61-\x7A]+', ''
    
    # Regular Expression - Unicode - Matching Specific Code Points 
    $String -replace '[^\u0030-\u0039\u0041-\u005A\u0061-\u007A]+', ''
    
    # Regular Expression - Unicode - Unicode Categories 
    $String -replace '[^\p{L}\p{Nd}]', ''
    
    # Regular Expression - Unicode - Unicode Categories
    #  Exceptions: We want to keep the following characters: ( } _ 
    $String -replace '[^\p{L}\p{Nd}/(/}/_]', ''
    

相关内容