Як видалити символи не-ASCII з рядка у скрипті bat?


1

Іноді %COMPUTERNAME% Значення змінної містить не-ASCII символи, але коли я використовую цю змінну в пакетному сценарії, мені потрібно зберігати тільки символи ASCII відповідного значення.

Як я можу отримати значення рядка з не-ASCII символами, щоб відображати лише символи ASCII за допомогою пакетного сценарію?


Може бути гарним вибором, щоб спочатку змінити символи з діакритичними знаками (акцентами) на їх основний характер див. цей сценарій PowerShell
LotPings

Відповіді:


1

Можна скористатися деякими з перерахованих методів Видалення спеціальних символів з рядка за допомогою регулярного виразу (Regex) з пакетним скриптом, наприклад, нижче.

Просто використовуйте власну потужність Windows, розроблену компанією Microsoft і виконати цю роботу просто за допомогою PowerShell у вашому пакетному сценарії, щоб встановити %computername% без символу non-ASCII для того, що повертається з командами PowerShell.


Пакетний скрипт для видалення не-Ascii

Обов'язково встановіть SET PCName= змінна відповідно до вашого сценарію, щоб включитися з тим, що ваша логіка вже працює (наприклад, SET PCName=%computername%і т.д.)

Замість того щоб використовувати DO ECHO %%~F з FOR /F цикл у скрипті нижче, ви можете встановити це DO SET PCNameASCII=%%~F замість, наприклад, і потім %PCNameASCII% змінна може бути включена в іншу частину логіки пакетного сценарію, і це завжди буде %ComputerName% значення змінних, але тільки символи ASCII.

@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

Подальші ресурси


Я б використовував $Env:COMPUTERNAME в частині PowerShell, щоб не включати поточне перетворення кодової сторінки
LotPings

Я подумав про те, що, але так як було згадано, що %computername% Ця змінна вже використовувалася, я тільки що залишив, як це відбувається, тому що це те, що вже використовується, щоб зберегти якомога більшу частину не-PowerShell, щоб забезпечити, що операційна система може легко включити її в існуючу логіку, що використовується на їхній стороні. Але так, використовуючи $String = $Env:COMPUTERNAME в PowerShell дасть такий самий результат, як $String = '%PCName%' робить з пакетного сценарію, який я надав.
Pimp Juice IT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.