<?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=4850&amp;type=atom" />
	<updated>2010-10-12T14:49:39Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=4850</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40373#p40373" />
			<content type="html"><![CDATA[<p>Спасибо!</p>]]></content>
			<author>
				<name><![CDATA[salikoff]]></name>
			</author>
			<updated>2010-10-12T14:49:39Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40373#p40373</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40335#p40335" />
			<content type="html"><![CDATA[<p>Пост <a href="http://forum.script-coding.com/viewtopic.php?pid=38793#p38793">#5</a>. Если Вы выполните команду:<br /></p><div class="codebox"><pre><code>set /?</code></pre></div><p>сможете прочитать процитированный в том посте кусок подсказки.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-10-12T05:41:59Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40335#p40335</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40333#p40333" />
			<content type="html"><![CDATA[<p>set /?</p>]]></content>
			<author>
				<name><![CDATA[smaharbA]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2911</uri>
			</author>
			<updated>2010-10-12T05:27:10Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40333#p40333</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=40332#p40332" />
			<content type="html"><![CDATA[<p>Извините, но никак не догоню синтаксис выражения </p><div class="codebox"><pre><code>if &quot;%%i&quot;==&quot;%connection:&quot;=%&quot; set connected=1</code></pre></div><p>.<br />А именно, вот этот кусок: %connection:&quot;=%. Вижу, что происходит замена символов, но нигде в справке не смог отыскать информацию об операторе : (двоеточие).<br />Можно ли объяснить поподробнее, как это работает или кинуть ссылку описание этой конструкции?</p>]]></content>
			<author>
				<name><![CDATA[salikoff]]></name>
			</author>
			<updated>2010-10-12T05:22:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=40332#p40332</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38941#p38941" />
			<content type="html"><![CDATA[<p>Спасибо, Alexii !<br />Теперь всё совершенно понятно.</p>]]></content>
			<author>
				<name><![CDATA[fsc_psd]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26180</uri>
			</author>
			<updated>2010-08-27T01:18:46Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38941#p38941</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38838#p38838" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>Наверное, в одном из предыдущих вариантов скрипта кавычки там могли появляться от случая к случаю, да?</p></blockquote></div><p>Думаю, так.<br /></p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><div class="quotebox"><cite>alexii пишет:</cite><blockquote><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>…но меня крепко ввело в сомнение, что каретка меняет поведение отдельной одиночной команды - ipconfig. Почему так?</p></blockquote></div><p>Нет, не меняет…</p></blockquote></div><p>Всё-таки меняет. Я даже на другом виндовсе сейчас попробовал. Итого и на XP и на 2003 команда &quot;ipconfig^&quot; ведёт себя так…</p></blockquote></div><p>Не меняет. Вы невнимательно ознакомились с приведённой выше в <a href="http://forum.script-coding.com/viewtopic.php?pid=38790#p38790">посте #3</a> <a href="http://rsdn.ru/article/winshell/batanyca.xml#ENB">ссылкой</a>, ибо следующий же раздел: <a href="http://rsdn.ru/article/winshell/batanyca.xml#EOG">Как перенести длинную строку?</a>, как раз объясняет данное поведение — в интерактивном режиме интерпретатор командного процессора просто ожидает продолжения ввода команды на новой строке (что Вы, собственно, и описали).</p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>…а почему при втором проходе интерпретатор уже не будет учитывать символ каретки в качестве экрана для спецсимвола контейнера?</p></blockquote></div><p>Данный спецсимвол после обработки удаляется интерпретатором командного процессора. Потому ко второму проходу строка придёт в требуемом нам виде — «ipconfig|FIND &quot;IP-&quot;».</p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>Я, на самом деле, даже не за пример переживаю, а просто не смог найти внятную информацию о правилах употребления одинарных кавычек. С двойными вроде всё более-менее понятно. В качестве конкретного короткого примера можно взять «&#039;ipconfig^|FIND &quot;IP-&quot;&#039;» из прошлого вопроса. С его помощью я теперь, конечно, сориентировался, что к чему, но хотелось бы почитать полный свод правил, касающийся одинарных кавычек и их отличий от двойных.</p></blockquote></div><p>Тут песня интересная. В данном случае («for …») есть <em>два</em> поведения интерпретатора:<br /></p><div class="quotebox"><cite>for /? пишет:</cite><blockquote><p>…<br />FOR /F [&quot;ключи&quot;] %переменная IN (набор) DO команда [параметры]<br />FOR /F [&quot;options&quot;] %variable IN (&quot;literal string&quot;) DO command [command-parameters]<br />FOR /F [&quot;options&quot;] %variable IN (&#039;command&#039;) DO command [command-parameters]</p><p>&nbsp; &nbsp; или, если использован параметр usebackq:</p><p>FOR /F [&quot;options&quot;] %variable IN (filenameset) DO command [command-parameters]<br />FOR /F [&quot;options&quot;] %variable IN (&#039;literal string&#039;) DO command [command-parameters]<br />FOR /F [&quot;options&quot;] %variable IN (`command`) DO command [command-parameters]<br />…</p></blockquote></div><p>т.е. — если не использован предикат «usebackq» — строка в одинарных кавычках рассматривается как команда (которую нужно выполнить, а вывод этой команды разобрать), если использован — то рассматривается как обычная строка.</p><p>В противоположность этому, строка в двойных кавычках — если не использован предикат «usebackq» — рассматривается как обычная строка, а если использован — то как набор обычный файлов (filenameset).</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-08-21T19:47:55Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38838#p38838</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38816#p38816" />
			<content type="html"><![CDATA[<p>Доброго утра!<br />Ещё раз извиняюсь - голова вчера была чугунная, попутал, видать, версии скрипта. Вот тот, о котором шла речь:</p><div class="codebox"><pre><code>@echo off
set connection=Megafon
set time_a1=&quot; 1:10:00,00&quot;
set time_a2=&quot; 7:50:00,00&quot;
 :LOOP
set connected=0
for /f &quot;delims=&quot; %%i in (&#039;rasdial&#039;) do (
    if &quot;%%i&quot;==&quot;%connection:&quot;=%&quot; set connected=1
)
    if    %connected%==0 (
    if /i &quot;%time%&quot; geq %time_a1% (
    if /i &quot;%time%&quot; leq %time_a2% (
          goto CONNECTING
                      )))
    if    %connected%==1 (
    if /i &quot;%time%&quot; geq %time_a1% (
    if /i &quot;%time%&quot; leq %time_a2% (
          goto CONNECTED
                      )))
    if    %connected%==0 (
          goto DISCONNECTED
                         )
    if    %connected%==1 (
          goto DISCONNECTING
                         )
goto TIMEOUTing
:CONNECTING
    echo %time% - &quot;%connection%&quot; connection not detected.
    echo Dialing...
    rasdial &quot;%connection:&quot;=%&quot;
    goto TIMEOUTing
:CONNECTED    
    echo %time% - &quot;%connection%&quot; connected
    goto TIMEOUTing
:DISCONNECTING
    echo %time% - &quot;%connection%&quot; connection is active.
    echo &quot;%connection%&quot; are disconnecting...
    rasdial &quot;%connection:&quot;=%&quot; /DISCONNECT
    goto TIMEOUTing
:DISCONNECTED
    echo %time% - &quot;%connection%&quot; disconnected
    goto TIMEOUTing
:TIMEOUTing
timeout /T 27
goto LOOP</code></pre></div><div class="quotebox"><blockquote><p>То есть, в данном случае «%connection:&quot;=%» означает — взять содержимое переменной окружения «connection» и убрать из него все включения кавычки «&quot;» (поскольку после знака равенства в выражении ничего нет).</p></blockquote></div><p>Да, похоже именно так. Спасибо большое! Наверное, в одном из предыдущих вариантов скрипта кавычки там могли появляться от случая к случаю, да?. Вчера это мне оказалось не по зубам.</p><div class="quotebox"><blockquote><p>Нет, не меняет.</p></blockquote></div><p>Всё-таки меняет. Я даже на другом виндовсе сейчас попробовал. Итого и на XP и на 2003 команда &quot;ipconfig^&quot; ведёт себя так: прежде чем выдать справку ipconfig интерпретатор два раза запрашивает &quot;Продолжить?&quot; Все, что будет введено в этом диалоге, дополнит название команды, т.е. если ответить &quot;123&quot;, то будет предпринята попытка выполнить &quot;ipconfig123&quot;. Если нажать enter, то запрос повторится, а после второго пустого ответа будет выполнена просто команда &quot;ipconfig&quot;. Каретка явно тут как-то замешана, вот я и подумал, что у нее есть ещё какие-то функции, мне неизвестные.</p><div class="quotebox"><blockquote><p>а вот когда интерпретатор «развернёт» строку «&#039;ipconfig^|FIND &quot;IP-&quot;&#039;» и начнёт обрабатывать саму последовательность команд «ipconfig|FIND &quot;IP-&quot;» — вот тогда символ «|» будет уже правильно воспринят как спецсимвол конвейера.</p></blockquote></div><p>Вас понял, большое спасибо! Скажите, пожалуйста, а почему при втором проходе интерпретатор уже не будет учитывать символ каретки в качестве экрана для спецсимвола контейнера?</p><div class="quotebox"><blockquote><p>Приведите конкретный короткий пример, я уже запутался.</p></blockquote></div><p>Я, на самом деле, даже не за пример переживаю, а просто не смог найти внятную информацию о правилах употребления одинарных кавычек. С двойными вроде всё более-менее понятно. В качестве конкретного короткого примера можно взять «&#039;ipconfig^|FIND &quot;IP-&quot;&#039;» из прошлого вопроса. С его помощью я теперь, конечно, сориентировался, что к чему, но хотелось бы почитать полный свод правил, касающийся одинарных кавычек и их отличий от двойных.</p>]]></content>
			<author>
				<name><![CDATA[fsc_psd]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26180</uri>
			</author>
			<updated>2010-08-21T04:08:50Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38816#p38816</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38793#p38793" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>Скрипт из первого вопроса…</p></blockquote></div><p>И где тут приведённые Вами строки в <a href="http://forum.script-coding.com/viewtopic.php?pid=38786#p38786">#1</a>?! Что-то не то.<br /></p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>1. В скрипте есть такие строки:</p><div class="codebox"><pre><code>set connection=Megafon
...
if &quot;%%i&quot;==&quot;%connection:&quot;=%&quot; set connected=1</code></pre></div><p>Непонятен смысл конструкции &quot;%connection:&quot;=%&quot;. Конструкция &quot;%connection%&quot; работает вполне адекватно.</p></blockquote></div><div class="quotebox"><cite>set /? пишет:</cite><blockquote><p>…<br />Подстановка переменной среды может быть расширена следующим образом:<br /></p><div class="codebox"><pre><code>%PATH:str1=str2%</code></pre></div><p>расширит действие переменной среды PATH, заменяя каждое вхождение &quot;str1&quot; в расширенном результате на &quot;str2&quot;.&nbsp; &quot;str2&quot; может быть пустой строкой для эффективного удаления вхождений &quot;str1&quot; из расширенного вывода. &quot;str1&quot; может начинаться со звездочки, и в этом случае это будет соответствовать любому началу расширенного вывода до первого вхождения оставшейся части &quot;str1&quot;.<br />…</p></blockquote></div><p>То есть, в данном случае «%connection:&quot;=%» означает — взять содержимое переменной окружения «connection» и убрать из него все включения кавычки «&quot;» (поскольку после знака равенства в выражении ничего нет).</p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>…но меня крепко ввело в сомнение, что каретка меняет поведение отдельной одиночной команды - ipconfig. Почему так?</p></blockquote></div><p>Нет, не меняет. Символ «^» воздействует только на восприятие интерпретатором командного процессора следующего за ним спецсимвола «|», дабы последний воспринимался не как спецсимвол конвейера, а как обычный символ (а вот когда интерпретатор «развернёт» строку «&#039;ipconfig<span style="color: red"><strong>^</strong></span>|FIND &quot;IP-&quot;&#039;» и начнёт обрабатывать саму последовательность команд «ipconfig|FIND &quot;IP-&quot;» — вот тогда символ «|» будет уже правильно воспринят как спецсимвол конвейера).</p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>Во втором примере фигурируют оба типа кавычек</p></blockquote></div><p>Приведите конкретный короткий пример, я уже запутался.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-08-20T13:57:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38793#p38793</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38791#p38791" />
			<content type="html"><![CDATA[<p>Скрипт из первого вопроса:<br /></p><div class="codebox"><pre><code>@set @x=0 /*
@echo off 
:_start 
start &quot;&quot; &quot;C:\Program Files\3G Modem Manager\3G Modem Manager.exe&quot; 
cscript //nologo /e:jscript &quot;%~f0&quot; 200000 
rasdial Night UserName UserPwd 
:_prv_soed 
set my_full_time=%TIME% 
IF %my_full_time:~0,1%==0 ( 
   set my_house=%my_full_time:~1,1% 
   ) else ( 
   set my_house=%my_full_time:~0,2% 
   ) 
IF %my_full_time:~3,1%==0 ( 
   set my_min=%my_full_time:~4,1% 
   ) else ( 
   set my_min=%my_full_time:~3,2% 
   ) 
if %my_house% GEQ 7 (if %my_min% GEQ 55 (goto :_Kill_all)) 
cscript //nologo /e:jscript &quot;%~f0&quot; 60000 
Ping -n 1 ya.ru &gt;Nul 
if ErrorLevel 1 GoTo :_Kill_Proc 
if ErrorLevel 0 GoTo :_prv_soed 
:_Kill_proc 
rasdial Night /Disconnect 
cscript //nologo /e:jscript &quot;%~f0&quot; 60000 
Taskkill /F /IM &quot;3G Modem Manager.exe&quot; 
cscript //nologo /e:jscript &quot;%~f0&quot; 60000 
goto :_start 
:_Kill_all 
rasdial Night /Disconnect 
cscript //nologo /e:jscript &quot;%~f0&quot; 60000 
Taskkill /F /IM &quot;3G Modem Manager.exe&quot; 
goto:eof */ if(isFinite(WScript.Arguments(0))) WScript.Sleep(WScript.Arguments(0))</code></pre></div><p>Насчёт насчёт каретки во втором скрипте ситуация, похоже, отчасти прояснилось - я и правда затупил с экранированием - но меня крепко ввело в сомнение, что каретка меняет поведение отдельной одиночной команды - ipconfig. Почему так?</p><p>По поводу кавычек - я просто не обнаружил связного объяснения их функций и отличий друг от друга. Во втором примере фигурируют оба типа кавычек и закономерности их употребления слегка загадочны.</p>]]></content>
			<author>
				<name><![CDATA[fsc_psd]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26180</uri>
			</author>
			<updated>2010-08-20T13:13:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38791#p38791</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38790#p38790" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>2. В скрипте есть такие строки:</p><div class="codebox"><pre><code>FOR /F &quot;tokens=1,2* delims=:&quot; %a in (&#039;ipconfig^|FIND &quot;IP-&quot;&#039;) do @ECHO %b</code></pre></div><p>Непонятен смысл конструкции (&#039;ipconfig^|FIND &quot;IP-&quot;&#039;). Каретка явно меняет поведение выражения, но почему - не пойму. Более того, поведение отдельной команды ipconfig тоже меняется при запуске ее с кареткой, в виде ipconfig^. То есть, налицо какие-то неочевидные мне функции каретки.</p></blockquote></div><p>«|» — спецсимвол, потому в выражении «FOR /F … (&#039;ipconfig|FIND &quot;IP-&quot;&#039;) do…» рассматривается не как часть вложенной команды «ipconfig|FIND &quot;IP-», а как часть внешней команды «for /f…», вследствие чего получается не то, что нужно, а ошибка. Посему подобные спецсимволы в подобных случаях требуют экранирования: <a href="http://rsdn.ru/article/winshell/batanyca.xml#ENB">Как экранировать символ?</a>. Ну, и, вообще, рекомендуется ознакомиться с <a href="http://forum.script-coding.com/viewtopic.php?id=2887">CMD/BAT: Коллекция ссылок</a>.</p><p>Что именно неясно в:<br /></p><div class="quotebox"><cite>fsc_psd пишет:</cite><blockquote><p>Плюс, не получается четко уловить отличие между двойными и одинарными кавычками.</p></blockquote></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-08-20T12:51:06Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38790#p38790</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38789#p38789" />
			<content type="html"><![CDATA[<p><strong>fsc_psd</strong>, надо было дополнительно привести весь скрипт целиком. Сделайте это, пожалуйста. <span style="color: green">Код на форуме оформляется <a href="http://forum.script-coding.com/help.php#bbcode">тэгом «code»</a>, я поправил.</span></p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-08-20T12:44:02Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38789#p38789</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: неясности синтаксиса]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=38786#p38786" />
			<content type="html"><![CDATA[<p>Здравствуйте.</p><p>Я дико извиняюсь за предположительно идиотские вопросы, но самостоятельный поиск результатов не приносит. Я честно старался полдня, читал документацию и примеры, прилично обогатил жизненный опыт, но ответа так и не нашёл.<br />Неясности таковы:</p><p>1. В скрипте есть такие строки:<br /></p><div class="codebox"><pre><code>set connection=Megafon
...
if &quot;%%i&quot;==&quot;%connection:&quot;=%&quot; set connected=1</code></pre></div><p>Непонятен смысл конструкции &quot;%connection:&quot;=%&quot;. Конструкция &quot;%connection%&quot; работает вполне адекватно.</p><p>2. В скрипте есть такие строки:<br /></p><div class="codebox"><pre><code>FOR /F &quot;tokens=1,2* delims=:&quot; %a in (&#039;ipconfig^|FIND &quot;IP-&quot;&#039;) do @ECHO %b</code></pre></div><p>Непонятен смысл конструкции (&#039;ipconfig^|FIND &quot;IP-&quot;&#039;). Каретка явно меняет поведение выражения, но почему - не пойму. Более того, поведение отдельной команды ipconfig тоже меняется при запуске ее с кареткой, в виде ipconfig^. То есть, налицо какие-то неочевидные мне функции каретки. Плюс, не получается четко уловить отличие между двойными и одинарными кавычками.</p><p>3. Вопрос несколько не в тему: при попытке найти ответы на вышеизложенные вопросы я столкнулся с тем, что гугль и яндекс не осуществляют поиск по спецсимволам. Экранировать их никак не получается, в документации к поисковым машинам тоже ничего на этот счёт не сказано.</p><p>Может быть, кого-нибудь не затруднит помочь мне?</p>]]></content>
			<author>
				<name><![CDATA[fsc_psd]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26180</uri>
			</author>
			<updated>2010-08-20T11:54:29Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=38786#p38786</id>
		</entry>
</feed>
