1

Тема: CMD/BAT: смена регистра строки текста

Набор функций для пакетного файла для смены регистра (UpperCase, LowerCase, ProperCase) строки текста.

@echo off
setlocal enableextensions enabledelayedexpansion


set strText=МаМа МыЛа РаМу
call :UpperCase "%strText%" "strText"
echo UpperCase:  [%strText%]

set strText=МаМа МыЛа РаМу
call :LowerCase "%strText%" "strText"
echo LowerCase:  [%strText%]

set strText=МаМа МыЛа РаМу
call :ProperCase "%strText%" "strText"
echo ProperCase: [%strText%]


endlocal
exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Процедура UpperCase
rem 
rem %1 : строка текста
rem %2 : имя переменной для возврата транслированного значения
rem ==========================================================================
:UpperCase
    setlocal enableextensions enabledelayedexpansion
    
    call :Translate "%~1" "U" "strTempString"
    
    endlocal & set %~2=%strTempString%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Процедура LowerCase
rem 
rem %1 : строка текста
rem %2 : имя переменной для возврата транслированного значения
rem ==========================================================================
:LowerCase
    setlocal enableextensions enabledelayedexpansion
    
    call :Translate "%~1" "L" "strTempString"
    
    endlocal & set %~2=%strTempString%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Процедура ProperCase
rem 
rem %1 : строка текста
rem %2 : имя переменной для возврата транслированного значения
rem ==========================================================================
:ProperCase
    setlocal enableextensions enabledelayedexpansion
    
    set strTempString=%~1
    
    call :UpperCase "%strTempString:~0,1%" "strFirstChar"
    call :LowerCase "%strTempString:~1%"   "strLastChars"
    
    endlocal & set %~2=%strFirstChar%%strLastChars%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Процедура Translate
rem 
rem %1 : строка текста
rem %2 : направление трансляции (L|U)
rem %3 : имя переменной для возврата транслированного значения
rem ==========================================================================
:Translate
    setlocal enableextensions enabledelayedexpansion
    
    set strTempString=%~1
    
    for /f "tokens=2,3" %%i in ('findstr.exe /b /l "# " "%~f0"') do (
        if /i "%~2" equ "L" (
            set strTempString=!strTempString:%%~i=%%~j!
        ) else if /i "%~2" equ "U" (
            set strTempString=!strTempString:%%~j=%%~i!
        )
    )
    
    endlocal & set %~3=%strTempString%
    exit /b 0
rem ==========================================================================

rem ==========================================================================
rem Таблица трансляции символов
rem ==========================================================================
# A a
# B b
# C c
# D d
# E e
# F f
# G g
# H h
# I i
# J j
# K k
# L l
# M m
# N n
# O o
# P p
# Q q
# R r
# S s
# T t
# U u
# V v
# W w
# X x
# Y y
# Z z
# А а
# Б б
# В в
# Г г
# Д д
# Е е
# Ё ё
# Ж ж
# З з
# И и
# Й й
# К к
# Л л
# М м
# Н н
# О о
# П п
# Р р
# С с
# Т т
# У у
# Ф ф
# Х х
# Ц ц
# Ч ч
# Ш ш
# Щ щ
# Ъ ъ
# Ы ы
# Ь ь
# Э э
# Ю ю
# Я я
rem ==========================================================================
UpperCase:  [МАМА МЫЛА РАМУ]
LowerCase:  [мама мыла раму]
ProperCase: [Мама мыла раму]

Отдельное спасибо коллегам kiber_punk и Rumata за идею.

См. также Серый форум / CMD/BAT: транслитерация текста.

2

Re: CMD/BAT: смена регистра строки текста

Пакетный файл caps.cmd, демонстрирующий смену регистра строки текста.

@echo off

if "%~1" == "/?" goto help
if "%~2" == ""   goto help


for %%a in ( u l uf lf ) do (
    if /i "%~2" == "/%%~a" (
        setlocal enabledelayedexpansion

        call :%%a "%~1" "%~3"

        endlocal
        goto :EOF
    )
)


:help
echo Turns a character case in the text.
echo.
echo CAPS text /U^|/UF^|/L^|/LF [/i]
echo.
echo   text  Text to be transformed
echo   /U    To upper case
echo   /L    To lower case
echo   /UF   First character upper case
echo   /LF   First character lower case
echo   /I    Invert case
echo.
goto :EOF


rem
rem Upper case
rem
:u
if /i "%~2" == "/I" goto :l_ui

:u_li
call :uppercase "%~1"
echo.%caps_t%

goto :EOF


rem
rem Lower case
rem
:l
if /i "%~2" == "/I" goto :u_li

:l_ui
call :lowercase "%~1"
echo.%caps_t%

goto :EOF


rem
rem First chacarter upper case
rem
:uf
if /i "%~2" == "/I" goto :lf_ufi

:uf_lfi
call :init "%~1"

call :uppercase "%caps_1%"
set caps_1=%caps_t%

call :lowercase "%caps_n%"
set caps_n=%caps_t%

echo.%caps_1%%caps_n%

goto :EOF


rem
rem First chacarter lower case
rem
:lf
if /i "%~2" == "/I" goto :uf_lfi

:lf_ufi
call :init "%~1"

call :lowercase "%caps_1%"
set caps_1=%caps_t%

call :uppercase "%caps_n%"
set caps_n=%caps_t%

echo.%caps_1%%caps_n%

goto :EOF


rem
rem Initialization
rem
:init
set caps_o=%~1
if not defined caps_o goto :EOF

set caps_1=%caps_o:~0,1%
set caps_n=%caps_o:~1%

goto :EOF

rem
rem Upper case, internally used
rem
:uppercase
set caps_t=%~1
call :translation_table 1

goto :EOF


rem
rem Lower case, internally used
rem
:lowercase
set caps_t=%~1
call :translation_table

goto :EOF


rem
rem
rem
:translation_table
if not defined caps_t goto :EOF

set caps_skip=154
for /f "usebackq tokens=1,2 skip=%caps_skip%" %%a in ( "%~dpnx0" ) do (
    if "%~1" == "" (
        set caps_t=!caps_t:%%~a=%%~b!
    ) else (
        set caps_t=!caps_t:%%~b=%%~a!
    )
)
goto :EOF


rem
rem USER-DEFINED TRANSLATION TABLE
rem
rem USE FORMAT STRICTLY AS BELOW:
rem UPPER lower
A a
B b
C c
D d
E e
F f
G g
H h
I i
J j
K k
L l
M m
N n
O o
P p
Q q
R r
S s
T t
U u
V v
W w
X x
Y y
Z z

Код замечателен тем, что его можно безболезненно расширить, добавив в конец файла собственный набор таблицы трансляции в формате ЗАГЛАВНАЯ_БУКВА строчная_буква, например:

А а
Б б
...
Ю ю
Я я

Надо только помнить, что заглавные буквы идут первыми, за ними строчные.

Примеры использования:

caps.cmd qwerty /u
caps.cmd qwerty /uf
caps.cmd qwerty /uf /l

Автор скрипта — Rumata.

3 (изменено: wisgest, 2013-01-06 13:45:06)

Re: CMD/BAT: смена регистра строки текста

Если в качестве аргумента утилиты FIND указать путь к несуществующему файлу, то она выдаст сообщение об ошибке, содержащее этот путь в верхнем регистре. Это побочное действие можно вызвать преднамеренно для преобразования к верхнему регистру произвольной строки:

@ echo off
setlocal enableextensions

set strText=*** Hello: World? ***
echo %strText%
call :UpperCase "%strText%" "strText"
echo UpperCase: %strText%

pause
exit /b 0

:UpperCase
:: Преобразование текстовой строки к верхнему регистру
:: %1 - исходная строка
:: %2 - переменная для записи результата
setlocal
set strTempString=%~1
for /f "tokens=2* delims=:" %%a in ('find "" ":%~1\" 2^>^&1') do set strTempString=%%b
endlocal & set %~2=%strTempString:~0,-1%
exit /b 0

Пояснение: После преобразуемой строки добавляем «\» — получаем путь к заведомо несуществующему файлу с пустым именем. (Похоже, что этого достаточно, но для удобства разбора вывода FIND перед строкой также добавляем «:», что можно рассматривать как пустое имя диска. С другой стороны, одного двоеточия было бы мало, т.к. в этом случае при наличии в собственно «имени файла» подстановочных знаков «*» или «?» FIND начинает обрабатывать стандартный поток ввода.)

Автор решения — Arigato (обсуждение).