<?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: Условные операторы на стероидах]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9490</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9490&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Условные операторы на стероидах».]]></description>
		<lastBuildDate>Wed, 13 May 2026 02:53:31 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Условные операторы на стероидах]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=163378#p163378</link>
			<description><![CDATA[<p>ок! Спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (ydscher)]]></author>
			<pubDate>Wed, 13 May 2026 02:53:31 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=163378#p163378</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Условные операторы на стероидах]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=163377#p163377</link>
			<description><![CDATA[<p><strong>ydscher</strong><br /><a href="https://github.com/ildar-shaimordanov/my-scripts/tree/master/cmd/when">https://github.com/ildar-shaimordanov/m … r/cmd/when</a></p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Tue, 12 May 2026 23:21:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=163377#p163377</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Условные операторы на стероидах]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=163376#p163376</link>
			<description><![CDATA[<p>Доброго дня. Тема очень интересна (для меня по крайней мере). <br />Но ссылка на скачивание нерабочая. <br />Есть альтернатива ?</p>]]></description>
			<author><![CDATA[null@example.com (ydscher)]]></author>
			<pubDate>Tue, 12 May 2026 21:36:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=163376#p163376</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: Условные операторы на стероидах]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=81794#p81794</link>
			<description><![CDATA[<p><strong>Необходимое вступление</strong><br />В конце прошлого года я решил обновить старый и давно заброшенный проект, который предполагался быть коллекцией каких-то полезных наработок по пакетным файлам, но так им и не стал. На этот раз я решил попробовать улучшить условные операторы, видоизменить с целью повышения их полезности, гибкости и мощности. </p><p>В основу улучшений легла встроенная функция <strong>test</strong> из unix shell. Именно они и были названы &quot;стероидами&quot;. </p><p>Не все условные выражения test реализованы. Некоторые и них работают только при определенных условиях. Было добавлено несколько собственных решений. </p><p>В процесе разработки строго соблюдалось правило - использовать <span class="bbu">только внутренние команды</span> интерпретатора CMD.EXE. Следование этому правилу не повлияло на реализацию условных выражений. </p><p>Работа носила академический интерес, но результаты могут быть интересны в использовании на практике. </p><p><strong>Ссылка на скачивание</strong><br />К сожалению, лаконично писать я не умею, поэтому помещаю ссылку поближе к началу, чтобы она не затерялась и заинтересованные могли ее быстро найти. <br /><a href="https://github.com/ildar-shaimordanov/cmd.scripts/blob/master/when.bat">https://github.com/ildar-shaimordanov/c … r/when.bat</a></p><p><strong>Стандартный оператор IF</strong><br />Стандарная форма условного оператора весьма ограничена. <br /></p><div class="codebox"><pre><code>
if EXPR (
    DO_THEN
) else (
    DO_ELSE
)
</code></pre></div><p>Она фактически не умеет вычислять более сложные логические выражения вида <strong>EXPR1 and EXPR2 ...</strong> или <strong>EXPR1 or EXPR2 ...</strong>. В общем случае это либо классические решения с использованием меток, либо сокращенные версии вида <strong>if EXPR1 if EXPR2 DO_THEN</strong>. </p><p>Есть несколько случаев, когда простая проверка реализована в виде громоздкой конструкции с использованием циклов (проверка атрибутов или свойств файла). Данное решение скрывает эти недостатки и делает все условные проверки единообразными. </p><p><strong>Условный оператор на &quot;стероидах&quot;</strong><br />Общая форма &quot;стероидов&quot;:<br /></p><div class="codebox"><pre><code>
call when :if EXPR &amp;&amp; DO_THEN
</code></pre></div><p>Основа - стрипт <strong>when.bat</strong>. Он содержит две &quot;функции&quot; (функция - в терминах пакетных скриптов). <strong>:if</strong> вычисляет условное выражение и возвращает (0), если выражение верно, иначе (1). Возвращает код (2), в случае неправильных аргументов.</p><p><strong>:unless</strong> аналогично <strong>:if</strong>, но смысл проверки противоположен. </p><p>Аналогично встроенной команде <strong>IF</strong> функция вычисляет одно простое логческое выражение. Но, благодаря тому, что они возвращают статус их можно объединять в более сложные команды, эмулируя тем самым составные логические выражения. Следующие примеры несколько искусственные, но они иллюстрируют сказанное:</p><div class="codebox"><pre><code>
:: if &quot;%PROCESSOR_ARCHITEW6432%&quot; != &quot;&quot; &amp;&amp; &quot;%PROCESSOR_ARCHITECTURE%&quot; == &quot;x86&quot; (
:: )
(
    call when :if -n &quot;%PROCESSOR_ARCHITEW6432%&quot; &amp;&amp; call test :if &quot;%PROCESSOR_ARCHITECTURE%&quot; == &quot;x86&quot; 
) &amp;&amp; (
    echo режим эмуляции
)
</code></pre></div><div class="codebox"><pre><code>
:: if &quot;%PROCESSOR_ARCHITEW6432%&quot; == &quot;AMD64&quot; || &quot;%PROCESSOR_ARCHITEW6432%&quot; == &quot;IA64&quot; &amp;&amp; &quot;%PROCESSOR_ARCHITECTURE%&quot; == &quot;x86&quot; (
:: )
(
    call when :if &quot;%PROCESSOR_ARCHITEW6432%&quot; == &quot;AMD64&quot; || call test :if &quot;%PROCESSOR_ARCHITEW6432%&quot; == &quot;IA64&quot;
) &amp;&amp; (
    call when :if &quot;%PROCESSOR_ARCHITECTURE%&quot; == &quot;x86&quot; 
) &amp;&amp; (
    echo режим эмуляции
)
</code></pre></div><p>Псевдокод в комментариях к каждому примеру показывает какой вариант условного оператора эмулируется, если бы он был реализован. </p><p>Благодаря тому, что используется статус завершения (0 или 1) эти команды можно комбинировать с другими командами, реализуя достаточно сложные условные проверки. </p><p>Так как это внешний скрипт, его можно поместить в один из каталогов, описанных в переменной окружения %PATH%, и тогда скрипт будет доступен во всей системе. </p><p>Чтобы встроить и использовать его в своих скриптах без вызова внешнего скрипта достаточно выполнить следующую команду, которая встроит тело скрипта в основной (в примере filename): <br /></p><div class="codebox"><pre><code>
call when APPEND-TO filename
</code></pre></div><p>После этого функции <strong>:if</strong> и <strong>:unless</strong> будут доступны напрямую, по метке, без вызова внешноего скрипта:<br /></p><div class="codebox"><pre><code>
(
    call :if -n &quot;%PROCESSOR_ARCHITEW6432%&quot; &amp;&amp; call :if &quot;%PROCESSOR_ARCHITECTURE%&quot; == &quot;x86&quot; 
) &amp;&amp; (
    echo режим эмуляции
)
</code></pre></div><p><strong>Расширенные файловые операторы</strong></p><p>-a FILE<br />Верно, если файл существует.</p><p>-b FILE<br />Верно, если аргумент - дисковое устройство.</p><p>-c FILE<br />Верно, если аргумент - символьное устройство.</p><p>-d FILE<br />Верно, если аргумент - каталог. Аналогично -attr d.</p><p>-e FILE<br />Верно, если файл существует.</p><p>-f FILE<br />Верно, если аргумент - обычный файл.</p><p>-h FILE<br />Верно, если аргумент - ссылка. Аналогично -attr l.</p><p>-L FILE<br />Верно, если аргумент - ссылка. Аналогично -attr l.</p><p>-r FILE<br />Верно, если файл имеет атрибут только чтение. Аналогично -attr r.</p><p>-s FILE<br />Верно, если файл существует и непустой.</p><p>-w FILE<br />Верно, если файл доступен на запись, например, не установлен атрибут только чтение.</p><p>-x FILE<br />Верно, если файл исполнимый.</p><p>-attr ATTR FILE<br />Верно, если установлен атрибут файла.</p><p>Доступные следующие атрибуты:<br /></p><div class="codebox"><pre><code>
    Attribute                    Expansion
    FILE_ATTRIBUTE_DIRECTORY     d--------
    FILE_ATTRIBUTE_READONLY      -r-------
    FILE_ATTRIBUTE_ARCHIVE       --a------
    FILE_ATTRIBUTE_HIDDEN        ---h-----
    FILE_ATTRIBUTE_SYSTEM        ----s----
    FILE_ATTRIBUTE_COMPRESSED    -----c---
    FILE_ATTRIBUTE_OFFLINE       ------o--
    FILE_ATTRIBUTE_TEMPORARY     -------t-
    FILE_ATTRIBUTE_REPARSE_POINT --------l
    FILE_ATTRIBUTE_NORMAL        ---------
</code></pre></div><p>-path FILE<br />Верно, если файл есть в одном из каталогов переменной окружения PATH.</p><p><strong>Еще файловых операторов</strong></p><p>FILE1 -nt FILE2<br />Верно, если FILE1 новее чем FILE2 (в соответствии с временем модификации файла). Этот оператор зависит от пользовательских и региональных настроек. Это значит, что в общем случае, сравнение не может быть надежным.</p><p>FILE1 -ot FILE2<br />Верно, если FILE1 старее чем FILE2 (в соответствии с временем модификации файла). Этот оператор зависит от пользовательских и региональных настроек. Это значит, что в общем случае, сравнение не может быть надежным.</p><p><strong>Расширенные строковые операторы</strong></p><p>-n STRING<br />Верно, если строка непустая.</p><p>-z STRING<br />Верно, если строка пустая.</p><p><strong>Еще строковых операторов</strong></p><p>STACK -contains NEEDLE<br />Верно, если STACK содержит NEEDLE.</p><p>STACK -starts NEEDLE<br />Верно, если STACK начинается с NEEDLE.</p><p>STACK -ends NEEDLE<br />Вернл, если STACK завершается NEEDLE.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Mon, 14 Apr 2014 21:04:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=81794#p81794</guid>
		</item>
	</channel>
</rss>
