<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: Запятая, кавычки в условии IF]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=7617&amp;type=atom" />
	<updated>2012-11-20T21:11:06Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=7617</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=65907#p65907" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>CMD.EXE воспринимает запятую и точку с запятой как такие же разделители, как и пробел…</p><p>…пробельные символы, к которым во встроенных командах CMD.EXE приравнены запятые и точки с запятой…</p></blockquote></div><p>Обнаружил, что подобным образом почти всегда воспринимается и <span class="bbu">знак равенства</span>.</p><p>Хотя в этом случае всё-таки есть исключения, мне пока вспомнились лишь три:<br />• команда SET: попытка вставить знак равенства перед именем переменной — синтаксическая ошибка, также как и его отсутствие после имени изменяет обработку команды, но перед самой командой — пожалуйста;<br />• в условие команды IF: удвоенный — оператор сравнения, как ведёт себя одиночный — не вполне понимаю;<br />• выражение с заменой подстроки переменной окружения (%VAR:substr1=substr2%).</p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-11-20T21:11:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=65907#p65907</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=64177#p64177" />
			<content type="html"><![CDATA[<p><strong>Аскет</strong>, задавая вопрос ответа я не знал, ошибка была устранена наугад,<br />её причину сразу не мог понять (первой мыслью было существование в командных файлах опрации «запятая» как в Си-подобных языках).</p><p>О решении с кавычками я знал, но мне было интересно обойтись без них;<br />с кавычками могут быть свои трудности…<br /></p><div class="quotebox"><cite>Аскет пишет:</cite><blockquote><p>Всё логично же...</p></blockquote></div><p>А по-моему, не очень.<br />Не следует безоговорочно доверять справке: иногда в ней встречаются ошибки и часто — упрощения и приблизительности.</p><p>Во-первых (в-нулевых), случай, когда строки заданы явно, — надуман: нет пользы задавть оба операнда явно, а если уж взять в кавычки один, то надо и второй.</p><p>Во-вторых, из сказанного вовсе формально не следует твое умозаключение, это лишь «добрый совет» (не всегда такой уж и добрый…). Более того, с правильной точки зрения операнд не заключается в кавычки, а кавычки становятся частью операнда (</p><div class="codebox"><pre><code>if a==&quot;a&quot; (echo TRUE) else echo FALSE</code></pre></div><p>возвратит «FALSE»)<br />и могут быть не только внешними, но и находится внутри операндов при условии сохранения чётности и того, что пробельные символы, к которым во встроенных командах CMD.EXE приравнены запятые и точки с запятой, попадают между кавычек так, что операнды не распадаются на части, например </p><div class="codebox"><pre><code>set A=a&quot; b &quot;c
if %A%==%A% echo TRUE&amp; rem     Условие истинно
if &quot;%A%&quot;==&quot;%A%&quot; echo TRUE&amp; rem Синтаксическая ошибка</code></pre></div><p>Правда, при использовании отложенного раскрытия переменных команда, подобная последней , сработает, т.к., в этом случае вначале проверяется синтаксис команды, а уж затем в неё подставляется значение переменной, так что в этом случае совет использовать кавычки и можно считать добрым (хотя, опять же, всё зависит от обоих операндов).</p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-09-25T08:07:40Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=64177#p64177</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=64131#p64131" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Аскет пишет:</cite><blockquote><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>По поводу строки в моём решении <br /></p><div class="codebox"><pre><code>if _!text:~%i%^,1!==_ …</code></pre></div><p>у меня возник вопрос: почему понадобилось экранировать запятую?!</p></blockquote></div><p>Ну, в любом случае Вам, как автору решения (во всяком случае), должно быть виднее.<br />И всё же, отвечая на вопрос &quot;<strong>почему понадобилось экранировать запятую?!</strong>&quot;, скажу так: я бы заключил в кавычки. <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" /><br /></p><div class="codebox"><pre><code>&quot;!text:~%i%,1!&quot;==&quot;&quot;</code></pre></div><p>ИБО:<br /></p><div class="quotebox"><cite>Справочник по командной строке пишет:</cite><blockquote><p><strong>If</strong><br />строка1==строка2 <br />Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например, %1). <span style="color: black"><strong>Явно заданные строки нет необходимости заключать в кавычки.</strong></span></p></blockquote></div><p>Т.е. <em>НЕявно заданные строки (переменные) необходимо заключать в кавычки</em>.<br />Всё логично же...</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-09-24T07:36:15Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=64131#p64131</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=64130#p64130" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><p>Возможно, поэтому: </p><div class="codebox"><pre><code>cmd /?</code></pre></div><div class="quotebox"><blockquote><p>Специальные символы, которые требуют обязательного заключения в кавычки:<br />&nbsp; &nbsp; &nbsp;&lt;пробел&gt;<br />&nbsp; &nbsp; &nbsp;&amp;()[]{}^=;!&#039;+,`~</p></blockquote></div></blockquote></div><p>Я не совсем понимаю, к чему относится этот последний абзац из встроенной справки CMD.EXE (возможно, он — следствие некоторой небрежности):<br />в одних случаях одни из перечисленных симолов требуют заключения в кавычки или экранирования, чтобы не восприниматься как специальные, а другие не требуют,<br />а в других случаях — третие и четвёртые (т.е. другие по отношению к другим <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />),<br />я что-то не припоминаю таких случаев для квадратных и фигурных скобок, да и для плюса в большинстве случаев этого не требуется,<br />с другой стороны, в этом списке нет символов перенаправления…</p><br /><p>Но, по-моему, я нашёл источник ошибки: CMD.EXE воспринимает запятую и точку с запятой как такие же разделители, как и пробел, а попытка использовать незаковыченый пробел в операнде условия IF приводит к непредвиденному завершению операнда.<br />С другой стороны, по этой же причине, оказывается, не являются ошибочными такие выражения: </p><div class="codebox"><pre><code>if 1==1,echo TRUE
if,1;equ,1;echo TRUE</code></pre></div><p><strong>(</strong>Но с третьей стороны, при использовании в условиях незаковыченных переменных окружения без отложенного раскрытия, например </p><div class="codebox"><pre><code>if -%var:~0,1%==-/ (echo TRUE) else echo FALSE</code></pre></div><p>экранировать запятую не требуется (именно по подобию с этим я не мог сообразить, почему в случае отложенного раскрытия возникает ошибка), хотя это и понятно, т.к. в этом случае вначале в команду подставляется значение переменной, а уже затем выполняется анализ команды (если же запятую всё-таки заэкранировать, то ошибка не выскочет, но выражение в условии будет восприниматься буквально, без подстановки значения из переменной), но и тут не всё гладко — если переменная пуста (не определена), ошибка всё-таки возникнет.<strong>)</strong></p>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-09-24T07:35:36Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=64130#p64130</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=64129#p64129" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Rumata пишет:</cite><blockquote><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>почему понадобилось экранировать запятую?</p></blockquote></div><p>Возможно, поэтому:<br /></p><div class="codebox"><pre><code>cmd /?
...
The special characters that require quotes are:
     &lt;space&gt;
     &amp;()[]{}^=;!&#039;+,`~</code></pre></div></blockquote></div>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-09-24T07:34:58Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=64129#p64129</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: Запятая, кавычки в условии IF]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=64128#p64128" />
			<content type="html"><![CDATA[<p><em>Перенёс обсуждение запятой в условии IF из темы <a href="http://forum.script-coding.com/viewtopic.php?id=7582">CMD/BAT: перевёртыш (зеркальное обращение текста) или Строковые ф-ции</a> сюда.</em></p><p><strong>Исходное сообщение:</strong> </p><div class="quotebox"><blockquote><p>По поводу строки в моём решении </p><div class="codebox"><pre><code>if _!text:~%i%^,1!==_ …</code></pre></div><p>у меня возник вопрос: <strong>почему понадобилось экранировать запятую?!</strong></p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[wisgest]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=3850</uri>
			</author>
			<updated>2012-09-24T07:34:20Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=64128#p64128</id>
		</entry>
</feed>
