<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=7571&amp;type=atom" />
	<updated>2012-09-17T06:38:51Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=7571</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63921#p63921" />
			<content type="html"><![CDATA[<p>про транслит написано выше, но не подумал про символы псевдографики - спасибо за идею<br /></p><div class="codebox"><pre><code>echo off
setlocal ENABLEDELAYEDEXPANSION
set opt=%~2
if &quot;%opt%&quot;==&quot;&quot; set opt=%~1
call :length &quot;%opt%&quot;
call :translite &quot;%opt%&quot;
choice /c &quot;%opt%%translite%&quot; /m &quot;%~1&quot; /n
set e=%ERRORLEVEL%
if %e% gtr %length% set /a e=%e% - %length%
exit /b %e%

:translite () {
    @@rem Процедура &quot;транслитерации&quot;
    @@rem
    setlocal ENABLEDELAYEDEXPANSION
    set opt=%~1
    set opt=%opt:&quot;=&#039;%
    set out=%~0
    if &quot;%out:~0,1%&quot;==&quot;:&quot; (
        set out=%out:~1%
        ) else (
        set out=out
        )
    set eng=qwertyuiopasdfghjklzxcvbnm0123456789
    set rus=йцукенгшщзфывапролдячсмить&amp;#9619;&amp;#9474;&amp;#9508;&amp;#9569;&amp;#9570;&amp;#9558;&amp;#9557;&amp;#9571;&amp;#9553;&amp;#9559;
    set ret=
    call :length &quot;%opt%&quot;
    set /a length=%length% - 1
    set charinstr=-1
    for /l %%x in (0,1,%length%) do (
        set x=!opt:~%%x,1!
        call :charinstr &quot;%eng%&quot; &quot;!x!&quot;
        if !charinstr! geq 0 (
            for /l %%y in (!charinstr!,1,!charinstr!) do (
                set ret=!ret!!rus:~%%y,1!
            )
        ) else (
            set ret=!ret!!opt:~%%x,1!
        )
    )
    endlocal &amp; set %out%=%ret%
    exit /b 0
}

:charinstr () {
    setlocal ENABLEDELAYEDEXPANSION
    set opt=%~1
    set opt=%opt:&quot;=&#039;%
    set char=%~2
    set out=%~0
    if &quot;%out:~0,1%&quot;==&quot;:&quot; (
        set out=%out:~1%
        ) else (
        set out=out
        )
    call :length &quot;%opt%&quot;
    set /a length=%length% - 1
    set ret=-1
    for /l %%x in (0,1,%length%) do (
        set x=!opt:~%%x,1!
        if /i &quot;%char%&quot;==&quot;!x!&quot; (
            set ret=%%~x
            goto break_charinstr
        )
    )
:break_charinstr
    endlocal &amp; set %out%=%ret%
    exit /b 0
}

:length (string) {
    @@rem Процедура определения длины строки
    @@rem
    setlocal
    set opt=%~1
    set opt=%opt:&quot;=&#039;%
    set out=%~0
    if &quot;%out:~0,1%&quot;==&quot;:&quot; (
        set out=%out:~1%
        ) else (
        set out=out
        )
    set /a n=0
    :loop_len
    if not &quot;%opt%&quot;==&quot;&quot; (
        set opt=%opt:~1%
        set /a n=%n%+1
        goto loop_len
        )
    endlocal &amp; set /a %out%=%n%
    exit /b 0
    }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-17T06:38:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63921#p63921</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63880#p63880" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>в строку вариантов выбора после каждого символа латиницы добавляется соответствующий символ кирилицы.</p></blockquote></div><p>Добавлять надо как заглавную букву, так и строчную. Choice.exe их различает.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-15T14:53:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63880#p63880</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63878#p63878" />
			<content type="html"><![CDATA[<p>Вот вариант скрипта для &quot;упрощённого варианта&quot;:<br /></p><div class="codebox"><pre><code>@echo off
setlocal enableextensions enabledelayedexpansion

set symb1=qwertyuiopasdfghjklzxcvbnm0123456789
set symb2=йцукенгшщзфывапролдячсмить&amp;#9617;&amp;#9618;&amp;#9619;&amp;#9562;&amp;#9563;&amp;#9564;&amp;#9565;&amp;#9566;&amp;#9567;&amp;#9568;

set outstr=
set instr=%~2
if _%instr%==_ goto usage

:loop1
set insym=%instr:~0,1%
set instr=%instr:~1%

::echo insym = &quot;%insym%&quot;
::echo instr = &quot;%instr%&quot;

set instr1=%symb1%
set instr2=%symb2%

:loop2

set insym1=%instr1:~0,1%
set instr1=%instr1:~1%
set insym2=%instr2:~0,1%
set instr2=%instr2:~1%

if /I not %insym%==%insym1% (
  if not _%instr1%==_ goto loop2
  exit /b 254
)

set outstr=%outstr%%insym1%%insym2%
::echo outstr = &quot;%outstr%&quot;

if not _%instr%==_ goto loop1

choice /m &quot;%~1&quot; /c &quot;%outstr%&quot; /n

set a=%errorlevel%
set /a a=(a+1)/2
::echo a=%a%
exit /b %a%

goto end

:usage
echo Usage: %~nx0 Prompt Symbols

:end
endlocal</code></pre></div><p>Идея в следующем: в строку вариантов выбора после каждого символа латиницы добавляется соответствующий символ кирилицы. errorlevel, который возвращает choice пересчитывается, чтобы соответствовать номерам исходного списка.<br />В строки symb1 и symb2 можно по аналогии забить символы кирилицы и латиницы, но нужно думать, что лучше делать с символами кирилицы, которым на клавиатуре соответствуют скобки, точки и прочие символы, т.к. choice их в списке указывать не позволяет. Для цифр в symb2 забиты символы псевдографики, которые choice принимает и которые вряд-ли кто-то случайно введёт с клавиатуры.</p><p>В CODE в symb2 символы псевдографики почему-то пролазить не хотят, поэтому: <br />1. я скрипт положил сюда: <a href="http://zalil.ru/33754479">http://zalil.ru/33754479</a><br />2. символы можно набрать так: В Far2 сохранить файл в кодовой таблице CP 866, удалить коды &amp; #9617; &amp; #9618; ... и скопировать символы отсюда: &amp;#9617;&amp;#9618;&amp;#9619;&amp;#9562;&amp;#9563;&amp;#9564;&amp;#9565;&amp;#9566;&amp;#9567;&amp;#9568;<br />3. В Far2 сохранить файл в кодовой таблице CP 866, поставить курсор на место соответствующего символа (&amp; #9617; и т.д.), зажать Alt, справа на цифровой клавиатуре ввести код соответствующего символа (9617, 9618 ...) и отпустить Alt. Должен будет вставиться соответствующий символ псевдографики.</p><p>Ну и, имхо, лучше вариант - написать свой вариант choice на VBS\JS, там будет больше возможностей по реакции на символы.</p>]]></content>
			<author>
				<name><![CDATA[Spy00000]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27060</uri>
			</author>
			<updated>2012-09-15T11:57:51Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63878#p63878</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63873#p63873" />
			<content type="html"><![CDATA[<p>упростим (для начала)<br />на вход приходит только набор из цифр и букв английского алфавмиа - как вернуть ответ для X и Ч одинаковый ?<br />реакция на нажатие клавишь должна быть как у choice - одна клавиша без ентеров<br />какой набор кодов будет получен заранее неизвестно</p><p>набор == перечень возможных вариантов выбора<br />пользователь должен мочь получить один и тот же результат при любой (из двух) текушей раскладке</p><p>конечно есть вариант цикла с транслированием и ожиданием в чюсе 1 сек, но это даст нечеткое срабатование</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-14T21:19:03Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63873#p63873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63872#p63872" />
			<content type="html"><![CDATA[<p><strong>smaharbA</strong>, я имею в виду, что, если, как Вы приводите <a href="http://forum.script-coding.com/viewtopic.php?pid=63864#p63864">выше</a> пример, на вход действительно может быть передан смешанный набор из латиницы и кириллицы, например, вида «YNДН» — попытка трактовать кириллицу как латиницу приведёт не к тому, что ожидалось.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-14T20:43:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63872#p63872</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63871#p63871" />
			<content type="html"><![CDATA[<p>смысл простой - сканкоды</p><p>т.е. - я не могу изменить передачу параметров, могу только повлиять на исполнение (код возврата)<br />параметры мне передает пакетник,&nbsp; изменить который я не могу<br />т.е. мне передали вопрос о нажатии YN - мой пакетник дожен одинаково отработать на нажатия как YN так и НТ, но что будет передано я не могу предвидеть<br />т.е. нужна одинаковая реакция на выбор как в английской раскладке, так и русской, но передается заранее неизвестный набор ключей</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-14T18:24:26Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63871#p63871</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63868#p63868" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>alexii - Вы не поняли…</p></blockquote></div><p>Да, не понял.</p><div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>даже если сделать транслит, то к примеру входная строка 2345678q замениться на 2345678q2345678й - что не будет работать</p></blockquote></div><p>Почему не будет? Только будет «2345678q2345678Й2345678й». Так ведь можно?</p><br /><div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>к примеру попадет выбор типа&nbsp; 23456QXZ179АБВ</p></blockquote></div><p>Тогда получается, что логика:<br /></p><div class="quotebox"><blockquote><p>что бы при нажатии Q либо Й - отрабатывал один и тот же код возврата</p></blockquote></div><p>не имеет смысла.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-14T16:35:04Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63868#p63868</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63864#p63864" />
			<content type="html"><![CDATA[<p>alexii - Вы не поняли - вызов пакетника заранее не известен и вызывающую строку менять нет возможности<br />даже если сделать транслит, то к примеру входная строка 2345678q замениться на 2345678q2345678й - что не будет работать</p><p>еще попробую пояснить, есть вызывающий пакетник (его нет возможности изменять), он может вызвать текущий с любым набором выбора к примеру попадет выбор типа&nbsp; 23456QXZ179АБВ - изменить его можно только внутри вызываемого так что бы код возврата был для QXZ=ЙЧЯ и так же АБВ=F&lt;D</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-14T14:12:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63864#p63864</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63862#p63862" />
			<content type="html"><![CDATA[<p>Не совсем то, и не совсем красиво, но… зато работает.<br /></p><div class="codebox"><pre><code>@echo off
setlocal enableextensions enabledelayedexpansion
choice.exe /m:&quot;Текст&quot; /c:YNНТнт /n
set /a iChoice = %errorlevel%
for %%i in (1, 3, 5) do if %iChoice% equ %%i echo Yes
for %%i in (2, 4, 6) do if %iChoice% equ %%i echo No
endlocal
exit /b 0</code></pre></div><div class="quotebox"><blockquote><p>что бы при нажатии Q либо Й - отрабатывал один и тот же код возврата</p></blockquote></div><p>Без переделки choice.exe — вряд ли. В первых версиях choice и вовсе русские буквы не воспринимал ни под каким соусом.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2012-09-14T12:41:43Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63862#p63862</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT:Как заставить choice понимать разную раскладку как одинаковую?]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=63860#p63860" />
			<content type="html"><![CDATA[<p>есть пакетник<br /></p><div class="codebox"><pre><code>
echo off
choice /m &quot;%~1&quot; /c &quot;%~2&quot; /n
exit /b %ERRORLEVEL%</code></pre></div><p>вызывается примерно так<br /></p><div class="codebox"><pre><code>
call utilit\ask 2345678q &quot;Выберете режим&quot;
if errorlevel 8 goto ...
...
if errorlevel 1 goto ...</code></pre></div><p>Дайте идею, что бы при нажатии Q либо Й - отрабатывал один и тот же код возврата, без переделки строки вызова (вызывающий пакетный файл сторонний и изменению не подлежит)</p><p>+ Можно конечно задействовать debug.exe, но не хотелось городить огород</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2012-09-14T12:24:19Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=63860#p63860</id>
		</entry>
</feed>
