<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=6555</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=6555&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Странная совместная работа SHIFT + IF».]]></description>
		<lastBuildDate>Wed, 29 Feb 2012 16:33:31 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57362#p57362</link>
			<description><![CDATA[<p>Пришлось побороться с этой магией скобок, кавычек. Следующий код допускает такие комбинации аргументов:<br /></p><div class="codebox"><pre><code>
script.bat filename другие параметры
script.bat /x &quot;string_x&quot; другие параметры
script.bat /x [/a &quot;string_a&quot;] [/b &quot;string_b&quot;] [/c &quot;string_c&quot;] другие параметры</code></pre></div><p>Дайте знать, если это не так. </p><div class="codebox"><pre><code>
@echo off

setlocal enabledelayedexpansion

if /i &quot;%~1&quot; == &quot;/x&quot; goto X1

	set X1_line=
	set X1_more=
	set X1_opt=%~1
	if defined X1_opt if not exist &quot;!X1_opt!&quot; (
		echo.File not found &quot;!X1_opt!&quot;.

		endlocal
		exit /b 1
	)
	shift /1

goto X2
:X1

	set X1_line=1
	set X1_more=

:X1_again

	for %%k in ( a b c ) do (
		if /i &quot;%~2&quot; == &quot;/%%~k&quot; (
			set X1_more=1
			set X1_opt_%%~k=%3
			shift /1
			shift /1
			goto X1_again
		)
	)

	if not defined X1_more (
		set X1_opt=%2
		shift /1
	)

	shift /1

:X2

set X1</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Wed, 29 Feb 2012 16:33:31 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57362#p57362</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57242#p57242</link>
			<description><![CDATA[<p>Неправильно делаете. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /><br />Всё сводится к <em>простому</em>* поиску подстроки в строке.<br />Как-то так:</p><div class="codebox"><pre><code>@REM Разбор произвольно расположенных аргументов 
@ECHO OFF
@SETLOCAL EnableDelayedExpansion EnableExtensions

:MAIN
    set params=%*
    IF NOT DEFINED params (exit/b)
    SET &quot;KEYS=&quot;/A &quot;,/B,/C,/D,/X,/register,/etc&quot;
    FOR %%R IN (%KEYS%) DO    (
        IF /i NOT  &quot;!params:%%~R=!&quot;==&quot;%params%&quot; (
            echo. ЇаЁбгвбвўгҐв Є«оз  [%%~R]
            REM здесь уже в зависимости от аргумента выполняем разбор, ala «SELECT CASE»:
            REM if &quot;%%~R&quot;==&quot;/A&quot; (…)
            REM if &quot;%%~R&quot;==&quot;/B&quot; (…)
            
            REM …или же просто:
            CALL :%%~R 2&gt;nul
            )
        )
exit/b

:/A
        echo  parsing for /A, and analysis input parameters
exit/b

:/C
        echo PARSE FOR /C
exit/b
…

:/X
        echo PARSE FOR /X 
exit/b</code></pre></div><div class="quotebox"><blockquote><p><strong>&gt;params.bat /A /B /C</strong><br /> присутствует ключ&nbsp; [/A ]<br /> parsing for /A, and analysis input parameters<br /> присутствует ключ&nbsp; [/b]<br /> присутствует ключ&nbsp; [/C]<br />PARSE FOR /C</p><p><strong>&gt;params.bat /x /a /C</strong><br /> присутствует ключ&nbsp; [/A ]<br /> parsing for /A, and analysis input parameters<br /> присутствует ключ&nbsp; [/C]<br />PARSE FOR /C<br /> присутствует ключ&nbsp; [/X]<br />PARSE FOR /X</p></blockquote></div><p>* - да, возможно тема никогда и не затрагивалась на форуме <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Аскет)]]></author>
			<pubDate>Sun, 26 Feb 2012 07:04:04 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57242#p57242</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57216#p57216</link>
			<description><![CDATA[<p>несколько не хочется напрягаться, вот код обработки аргументов, частный случай, но может чтото полезное найдется<br /></p><div class="codebox"><pre><code>:optexist (options) {
    @@rem Процедура поиска указанного параметра в командной строке скрипта
    @@rem
    setlocal
    set opt=%~1
rem    set arg=%opt:*:=%
    :loop_optexist
    shift
    if /i &quot;%opt%&quot;==&quot;%~1&quot; (
        exit /b 0
        ) else if &quot;%~1&quot;==&quot;&quot; (
        exit /b 1
        )
    goto loop_optexist
    endlocal
    exit /b 2
    }

:getopts (options) {
    @@rem Процедура получения всех параметров командной строке скрипта
    @@rem (не используется)
    @@rem
    setlocal
    :loop_getopts
    set value=
    set opt=%~1
    if &quot;%opt:~0,1%&quot;==&quot;/&quot; (
        set opt=%opt:~0,2%
        set value=%opt:~2%
        ) else if &quot;%opt:~0,1%&quot;==&quot;-&quot; (
        set opt=%opt:~0,2%
        set value=%opt:~2%
        ) else if &quot;%~1&quot;==&quot;&quot; (
        exit /b
        ) else (
        set value=%opt%
        set opt=
    )
    if &quot;%value%&quot;==&quot;&quot; (
        set value=%~2
        if &quot;%value:~0,1%&quot;==&quot;/&quot; (
            set value=
            ) else if &quot;%value:~0,1%&quot;==&quot;-&quot; (
            set value=
            ) else (
            shift
            )
        )
    shift
    echo set opt=%opt%^|set value=%value%
    goto loop_getopts
    endlocal
    exit /b
}

:optskip () {
    @@rem Процедура пропуска указанного параметра в командной строке скрипта
    @@rem (не используется)
    @@rem
    setlocal
    set ret=%~1
    set optskip=%~2
    :loop_optskip
    set opt=%~3
    if &quot;%opt:~0,1%&quot;==&quot;%optskip%&quot; (
        shift
        goto loop_optskip
        )
    endlocal &amp; set %ret%=%3 %4 %5 %6 %7 %8 %9
    exit /b
    }</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Sat, 25 Feb 2012 07:34:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57216#p57216</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57198#p57198</link>
			<description><![CDATA[<p><strong>alexii</strong>, уже - да. В идеале хотелось бы решить более универсально и разрешить произвольный порядок аргументов, но тогда алгоритм усложняется. Оригинал выглядит так:<br /></p><div class="codebox"><pre><code>
script.bat [/x [/a &quot;string_a&quot;] [/b &quot;string_b&quot;] [/c &quot;string_c&quot;]] другие параметры</code></pre></div><p>Я же намеренно упростил пример.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 24 Feb 2012 14:35:58 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57198#p57198</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57194#p57194</link>
			<description><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>…или их комбинация, но только в указанной последовательности.</p></blockquote></div><p>То есть:<br /></p><div class="codebox"><pre><code>script.bat /x /c /a</code></pre></div><p>— недопустимо?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 24 Feb 2012 14:04:18 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57194#p57194</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=57192#p57192</link>
			<description><![CDATA[<p>Возвращаюсь к своей же теме. Все очень и очень плохо. </p><p>Батник - это какое-то недоразумение. Боролся со скобками. Это была Пиррова победа. Батник - не шелл. Далеко не шелл. Хотя в последнем-то своих трудностей и своеобразностей хватает, но большинство их хорошо документировано и описано на многих ресурсах. </p><p>Мне надо было реализовать нечто, что описывается примерно так:</p><div class="codebox"><pre><code>script.bat [/x [/a] [/b] [/c]] другие параметры</code></pre></div><p>Или словесно: если указана опция /x, то допустимы одна из опций /a, /b, или /c, или их комбинация, но только в указанной последовательности. </p><p>Проблема решается только если использовать явные переход с помощью <strong>IF ... GOTO</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Fri, 24 Feb 2012 13:44:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=57192#p57192</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=55252#p55252</link>
			<description><![CDATA[<p><strong>Smitis</strong><br />В данном случае проблема не в &quot;метафизике&quot; переменных среды, а в использовании команд внутри блоков и их влиянии на команду. Коллега <strong>smaharbA</strong> привел в <a href="http://forum.script-coding.com/viewtopic.php?pid=55000#p55000">своем сообщении</a> очень интересный скрипт, который вроде бы и решает первоначальную проблему, но порождает новые вопросы. </p><p>Хотя Вы правы:<br /></p><div class="quotebox"><cite>Smitis пишет:</cite><blockquote><p>Получается, скобки действуют на параметры так же, как и на переменные среды</p></blockquote></div><div class="quotebox"><cite>Smitis пишет:</cite><blockquote><p>&lt;...&gt; Скобки как бы объединяют несколько строк в блок, который обрабатыватся как единое целое &lt;...&gt;</p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Tue, 03 Jan 2012 05:37:09 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=55252#p55252</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=55249#p55249</link>
			<description><![CDATA[<p>Как всё запутанно...<br />После нового года и не разобраться <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><p>Вообще, у командного процессора сдесь срабатывают такие основные принципы, imho:<br />- Принцип подстановки значений переменных - сначала считывается строка, затем значения переменных подставляются в строку, затем строка выполняется. Переменные среды в командном процессоре в большей степени это макроподстановки, а не переменные, как они понимаются в других языках.<br />- Скобки как бы объединяют несколько строк в блок, который обрабатыватся как единое целое. Т.е. помимо первой считанной строки командный процессор считывает все остальные до строки, содержащей закрывающую скобку (с учётом вложений), подставляет переменные, выполняет этот блок.</p>]]></description>
			<author><![CDATA[null@example.com (Smitis)]]></author>
			<pubDate>Mon, 02 Jan 2012 21:32:08 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=55249#p55249</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=55008#p55008</link>
			<description><![CDATA[<p><strong>smaharbA</strong><br />О боже! Магия. Но все абсолютно нелогично - в блоках с IF не работает, в блоках с call :label - работает. Ваш ответ поверг меня в шок.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Tue, 27 Dec 2011 07:53:47 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=55008#p55008</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=55000#p55000</link>
			<description><![CDATA[<div class="codebox"><pre><code>@echo off
call :test &quot;%%~1&quot; == &quot;A&quot; &amp;&amp; (
    set BUG_A=1
    shift /1
    call :test &quot;%%~1&quot; == &quot;B&quot; &amp;&amp; (
        set BUG_B=1
        shift /1
    )
    set BUG_C=1
)
set BUG
exit /b

:test
setlocal
shift
endlocal &amp; if not %* exit /b 1</code></pre></div><p>поправочка</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Tue, 27 Dec 2011 06:21:08 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=55000#p55000</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=54998#p54998</link>
			<description><![CDATA[<p><strong>smaharbA</strong><br />Коллега, выражайте свои мысли более развернуто. Сложно понять Ваши тезисы в контексте настоящей задачи.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Tue, 27 Dec 2011 05:24:17 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=54998#p54998</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=54996#p54996</link>
			<description><![CDATA[<p>никакой в блоках</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Tue, 27 Dec 2011 05:15:16 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=54996#p54996</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=54990#p54990</link>
			<description><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>отложенная обработка</p></blockquote></div><p>Эммм... Вы об чем? Какая может быть отложенная обработка? Два скрипта - первый и второй, одна логика, разный результат. О какой отложенной обработке в условных операторах может идти речь?</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 26 Dec 2011 20:21:24 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=54990#p54990</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=54985#p54985</link>
			<description><![CDATA[<p>отложенная обработка<br />Вы бы еще call :метка выполнили и удивлялися</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Mon, 26 Dec 2011 16:01:01 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=54985#p54985</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Странная совместная работа SHIFT + IF]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=54911#p54911</link>
			<description><![CDATA[<p>Получается, скобки действуют на параметры так же, как и на переменные среды. Потому что за скобками оказывается, что все команды shift внутри скобок отработали.</p>]]></description>
			<author><![CDATA[null@example.com (Smitis)]]></author>
			<pubDate>Fri, 23 Dec 2011 19:54:33 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=54911#p54911</guid>
		</item>
	</channel>
</rss>
