<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: смена регистра строки текста]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=3375&amp;type=atom" />
	<updated>2013-01-06T07:43:59Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=3375</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: смена регистра строки текста]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=68195#p68195" />
			<content type="html"><![CDATA[<p>Если в качестве аргумента утилиты FIND указать путь к несуществующему файлу, то она выдаст сообщение об ошибке, содержащее этот путь в верхнем регистре. Это побочное действие можно вызвать преднамеренно для преобразования к верхнему регистру произвольной строки:<br /></p><div class="codebox"><pre><code>@ echo off
setlocal enableextensions

set strText=*** Hello: World? ***
echo %strText%
call :UpperCase &quot;%strText%&quot; &quot;strText&quot;
echo UpperCase: %strText%

pause
exit /b 0

:UpperCase
:: Преобразование текстовой строки к верхнему регистру
:: %1 - исходная строка
:: %2 - переменная для записи результата
setlocal
set strTempString=%~1
for /f &quot;tokens=2* delims=:&quot; %%a in (&#039;find &quot;&quot; &quot;:%~1\&quot; 2^&gt;^&amp;1&#039;) do set strTempString=%%b
endlocal &amp; set %~2=%strTempString:~0,-1%
exit /b 0
</code></pre></div><p><em><span class="bbu">Пояснение</span>:</em> После преобразуемой строки добавляем «\» — получаем путь к заведомо несуществующему файлу с пустым именем. (Похоже, что этого достаточно, но для удобства разбора вывода FIND перед строкой также добавляем «:», что можно рассматривать как пустое имя диска. С другой стороны, одного двоеточия было бы мало, т.к. в этом случае при наличии в собственно «имени файла» подстановочных знаков «*» или «?» FIND начинает обрабатывать стандартный поток ввода.)</p><p>Автор решения — <strong>Arigato</strong> (<a href="http://forum.script-coding.com/viewtopic.php?id=7937">обсуждение</a>).</p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2013-01-06T07:43:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=68195#p68195</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: смена регистра строки текста]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25770#p25770" />
			<content type="html"><![CDATA[<p>Пакетный файл <strong>caps.cmd</strong>, демонстрирующий смену регистра строки текста.<br /></p><div class="codebox"><pre><code>@echo off

if &quot;%~1&quot; == &quot;/?&quot; goto help
if &quot;%~2&quot; == &quot;&quot;   goto help


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

        call :%%a &quot;%~1&quot; &quot;%~3&quot;

        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 &quot;%~2&quot; == &quot;/I&quot; goto :l_ui

:u_li
call :uppercase &quot;%~1&quot;
echo.%caps_t%

goto :EOF


rem
rem Lower case
rem
:l
if /i &quot;%~2&quot; == &quot;/I&quot; goto :u_li

:l_ui
call :lowercase &quot;%~1&quot;
echo.%caps_t%

goto :EOF


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

:uf_lfi
call :init &quot;%~1&quot;

call :uppercase &quot;%caps_1%&quot;
set caps_1=%caps_t%

call :lowercase &quot;%caps_n%&quot;
set caps_n=%caps_t%

echo.%caps_1%%caps_n%

goto :EOF


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

:lf_ufi
call :init &quot;%~1&quot;

call :lowercase &quot;%caps_1%&quot;
set caps_1=%caps_t%

call :uppercase &quot;%caps_n%&quot;
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 &quot;usebackq tokens=1,2 skip=%caps_skip%&quot; %%a in ( &quot;%~dpnx0&quot; ) do (
    if &quot;%~1&quot; == &quot;&quot; (
        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</code></pre></div><p>Код замечателен тем, что его можно безболезненно расширить, добавив в конец файла собственный набор таблицы трансляции в формате ЗАГЛАВНАЯ_БУКВА строчная_буква, например:<br /></p><div class="codebox"><pre><code>А а
Б б
...
Ю ю
Я я</code></pre></div><p>Надо только помнить, что заглавные буквы идут первыми, за ними строчные.</p><p><em>Примеры использования:</em><br /></p><div class="codebox"><pre><code>caps.cmd qwerty /u
caps.cmd qwerty /uf
caps.cmd qwerty /uf /l</code></pre></div><p>Автор скрипта — <strong>Rumata</strong>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-07-06T14:02:14Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25770#p25770</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: смена регистра строки текста]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=25755#p25755" />
			<content type="html"><![CDATA[<p>Набор функций для пакетного файла для смены регистра (UpperCase, LowerCase, ProperCase) строки текста.</p><div class="codebox"><pre><code>@echo off
setlocal enableextensions enabledelayedexpansion


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

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

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


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

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

rem ==========================================================================
rem Процедура LowerCase
rem 
rem %1 : строка текста
rem %2 : имя переменной для возврата транслированного значения
rem ==========================================================================
:LowerCase
    setlocal enableextensions enabledelayedexpansion
    
    call :Translate &quot;%~1&quot; &quot;L&quot; &quot;strTempString&quot;
    
    endlocal &amp; 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 &quot;%strTempString:~0,1%&quot; &quot;strFirstChar&quot;
    call :LowerCase &quot;%strTempString:~1%&quot;   &quot;strLastChars&quot;
    
    endlocal &amp; 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 &quot;tokens=2,3&quot; %%i in (&#039;findstr.exe /b /l &quot;# &quot; &quot;%~f0&quot;&#039;) do (
        if /i &quot;%~2&quot; equ &quot;L&quot; (
            set strTempString=!strTempString:%%~i=%%~j!
        ) else if /i &quot;%~2&quot; equ &quot;U&quot; (
            set strTempString=!strTempString:%%~j=%%~i!
        )
    )
    
    endlocal &amp; 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 ==========================================================================</code></pre></div><div class="quotebox"><blockquote><div class="codebox"><pre><code>UpperCase:  [МАМА МЫЛА РАМУ]
LowerCase:  [мама мыла раму]
ProperCase: [Мама мыла раму]</code></pre></div></blockquote></div><p>Отдельное спасибо коллегам <strong>kiber_punk</strong> и <strong>Rumata</strong> за идею.</p><p><em>См. также <a href="http://forum.script-coding.com/viewtopic.php?id=2390">Серый форум / CMD/BAT: транслитерация текста</a>.</em></p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2009-07-06T10:34:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=25755#p25755</id>
		</entry>
</feed>
