<?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>http://forum.script-coding.com/viewtopic.php?id=5332</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=5332&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Работа с переменными».]]></description>
		<lastBuildDate>Fri, 23 Nov 2012 17:50:46 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66077#p66077</link>
			<description><![CDATA[<div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>+ и страждущим стдоут в скобках не всегда тот же, что за скобками</p></blockquote></div><p>Согласен, и stderr тоже. Впрчем, это (для stdout) уже видно из<br /></p><div class="codebox"><pre><code>(pause&gt;con)&gt;tmp.txt</code></pre></div><p>в примере со stderr скобки тоже стоят на своих местах, если убрать лишние останется<br /></p><div class="codebox"><pre><code>(echo 123&gt;tmp.txt) 2&gt;nul || echo Ошибка!</code></pre></div><p>так что не ясно, о чём замечание.<br /></p><div class="quotebox"><cite>smaharbA пишет:</cite><blockquote><p>alexii - Вы правы - верный пример, работающим с gpg (ранее может и писал или не писал)</p></blockquote></div><p><a href="http://yandex.ru/yandsearch?text=gpg">О чём разговор?</a></p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Fri, 23 Nov 2012 17:50:46 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66077#p66077</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66071#p66071</link>
			<description><![CDATA[<p>+ и страждущим стдоут в скобках не всегда тот же, что за скобками</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Fri, 23 Nov 2012 16:52:35 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66071#p66071</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66070#p66070</link>
			<description><![CDATA[<p>alexii - Вы правы - верный пример, работающим с gpg (ранее может и писал или не писал)</p>]]></description>
			<author><![CDATA[null@example.com (smaharbA)]]></author>
			<pubDate>Fri, 23 Nov 2012 16:35:45 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66070#p66070</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66064#p66064</link>
			<description><![CDATA[<p>А я имел в виду для кода<br /></p><div class="codebox"><pre><code>(echo 123)&gt;tmp.txt</code></pre></div><p>очевидно, во втором случае, до момента «echo Ошибка!» всё то же самое, к тому же <em>errorlevel</em> представляет интерес именно в первом случае, во втором наличие ошибки обнаруживается и без него<br />(впрочем, скобки вокруг echo 123 в обоих случаях лишние, но без них всё то же самое).</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Fri, 23 Nov 2012 15:58:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66064#p66064</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66063#p66063</link>
			<description><![CDATA[<p>Я имел в виду — для приведённого выше кода:<br /></p><div class="codebox"><pre><code>((echo 123)&gt;tmp.txt) 2&gt;nul || echo Ошибка!</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 23 Nov 2012 15:43:03 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66063#p66063</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66056#p66056</link>
			<description><![CDATA[<div class="codebox"><pre><code>echo %errorlevel%</code></pre></div><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>В качестве примера такой ошибки (других я, правда, и не знаю) могу назвать попытку повторно открыть для записи файл.</p></blockquote></div><p>Сейчас проверил для SET /P из несуществуещего файла — тоже 0, хотя, кажется, раньше был 1, может я что-то путаю или неправильно делаю.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Fri, 23 Nov 2012 13:33:50 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66056#p66056</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66055#p66055</link>
			<description><![CDATA[<p>Как Вы определяли, что errorlevel был равен нулю?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 23 Nov 2012 13:25:11 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66055#p66055</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=66053#p66053</link>
			<description><![CDATA[<div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>(я просто не расписывал ветвь Else с сообщением об ошибке)</p></blockquote></div><p>Кроме несуществования файла, возможны и другие ошибки при попытке доступа к нему, к тому же он может быть удалён другой программой сразу же после проверки его существования.<br />Поэтому, может быть, лучше проверять наличие ошибки после попытки выполнить действие:<br /></p><div class="codebox"><pre><code>((try)&lt;file.txt) 2&gt;nul
if errorlevel 1 (catch)</code></pre></div><p>или<br /></p><div class="codebox"><pre><code>((try)&lt;file.txt) 2&gt;nul || (catch)</code></pre></div><p>— второй способ мне представляется предпочтительнее, т.к. им обрабываются ошибки, при которых <em>errorlevel</em> равен 0.</p><p>В качестве примера такой ошибки (других я, правда, и не знаю) могу назвать попытку повторно открыть для записи файл.<br />Вот как её можно воспроизвести:<br />запускаем командную строку в двух окнах с одинаковым рабочим каталогом,<br />в одном выполняем команду<br /></p><div class="codebox"><pre><code>(pause&gt;con)&gt;tmp.txt</code></pre></div><p>и не выходим из паузы,<br />пытаемся во втором окне выполнить<br /></p><div class="codebox"><pre><code>(echo 123)&gt;tmp.txt</code></pre></div><p>и получаем в ответ:<br /></p><div class="quotebox"><blockquote><p>Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.</p></blockquote></div><p><em>errorlevel</em> при этом будет равен 0, так что по нему о существовании ошибки узнать нельзя.<br />Тем не менее второй подход<br /></p><div class="codebox"><pre><code>((echo 123)&gt;tmp.txt) 2&gt;nul || echo Ошибка!</code></pre></div><p>ошибку видит.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Fri, 23 Nov 2012 12:43:29 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=66053#p66053</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=65969#p65969</link>
			<description><![CDATA[<div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>Разве это</p><br /><div class="codebox"><pre><code>if exist &quot;%sFile%&quot; &lt;&quot;%sFile%&quot; (
  set /p sUser=
  set /p sPass=
)</code></pre></div><p>не работает?!</p></blockquote></div><p>Это как раз работает. Очевидно, дело в том, что в данном случае ввод осуществляется как групповая операция. Мне почему-то ранее не приходило в голову испробовать такой подход. Будем знать.</p><div class="quotebox"><cite>wisgest пишет:</cite><blockquote><p>И, кстати, «if exist &quot;%sFile%&quot;» можно не проверять, можно просто подавить сообщение об ошибке:</p></blockquote></div><p>Подавить-то можно. Но не следует (я просто не расписывал ветвь Else с сообщением об ошибке).</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Wed, 21 Nov 2012 21:24:48 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=65969#p65969</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=65961#p65961</link>
			<description><![CDATA[<p>И, кстати, «if exist &quot;%sFile%&quot;» можно не проверять,<br />можно просто подавить сообщение об ошибке:<br /></p><div class="codebox"><pre><code>((
  set /p sUser=
  set /p sPass=
)&lt;0001.txt) 2&gt;nul</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Wed, 21 Nov 2012 20:42:38 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=65961#p65961</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=65957#p65957</link>
			<description><![CDATA[<div class="quotebox"><cite>Skrask пишет:</cite><blockquote><p>А как сделать так чтобы, содержимое первой строки передавалось переменной %sUser% а вторая строка в %sLogin%</p></blockquote></div><div class="quotebox"><cite>alexii пишет:</cite><blockquote><p>Командой «set /p», без извращений — никак, поскольку она не воспринимает передачу по конвейеру.</p></blockquote></div><p>Разве это<br /></p><div class="codebox"><pre><code>if exist &quot;%sFile%&quot; &lt;&quot;%sFile%&quot; (
  set /p sUser=
  set /p sPass=
)</code></pre></div><p>не работает?!</p><p>Насколько я могу судить, при перенапралении на вход файла, SET /P всё-таки позволяет читать последовательно строки. Другое дело, что при неизвестном числе строк не удасться узнать, достигнут ли конец файла. (Также трудности с чтением файла с помощью SET /P у меня возникали при переключении кодировок.)</p><br /><br /><p>Другое дело — перенаправление на вход SET /P вывода другой программы или команды. В этом случае возникают две трудности (наряду с тем, что нельзя определить, достигнут ли конец потока):</p><p>1) команда SET /P или содержащие ее составная команда или командный файл запускаются в новом процессе CMD.EXE с ключом /C, по отрабатыванию которого прочитанные строки теряются; но это еще не беда, главное — об этом помнить;</p><p>2) при достижении команды SET /P из всех успевших поступить на вход строк считывается самая первая — остальные теряются. Таким образом, гарантированно будет получена только первая строка из потока; может быть, удасться поймать невпопад ещё несколько, если только между выводами строк нет достаточной временной задержки.</p>]]></description>
			<author><![CDATA[null@example.com (wisgest)]]></author>
			<pubDate>Wed, 21 Nov 2012 20:29:55 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=65957#p65957</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=43262#p43262</link>
			<description><![CDATA[<p>Командой «set /p», без извращений — никак, поскольку она не воспринимает передачу по конвейеру. Извратиться можно, например, так:<br /><strong>0001.txt</strong><br /></p><div class="codebox"><pre><code>User Name
My password</code></pre></div><div class="codebox"><pre><code>@echo off
setlocal

set sFile=0001.txt
set sTempFile=TempFile.tmp

if exist &quot;%sFile%&quot; (
    &lt;&quot;%sFile%&quot; set /p sUser=&gt;nul
    more +1 &quot;%sFile%&quot;&gt;&quot;%sTempFile%&quot;
    &lt;&quot;%sTempFile%&quot; set /p sPass=&gt;nul
    del &quot;%sTempFile%&quot;
)
if defined sUser echo %sUser%
if defined sPass echo %sPass%

endlocal
exit /b 0</code></pre></div><p>Можно делать разбор,&nbsp; по приведённому примеру — тоже не слишком красивый, например так:<br /></p><div class="codebox"><pre><code>@echo off
setlocal

set sFile=0001.txt

if exist &quot;%sFile%&quot; (
    for /f &quot;usebackq delims=&quot; %%i in (&quot;%sFile%&quot;) do set sUser=%%i&amp; goto :Skip
:Skip
    for /f &quot;usebackq skip=1 delims=&quot; %%i in (&quot;%sFile%&quot;) do set sPass=%%i
)

if defined sUser echo %sUser%
if defined sPass echo %sPass%

endlocal
exit /b 0</code></pre></div><p>Тут уж лучше сделать текстовый файл a-la *.ini, наподобие:<br /><strong>0001.txt</strong><br /></p><div class="codebox"><pre><code>; My user name &amp; password
user=User Name
password=My password</code></pre></div><p>и пакетный файл к нему:<br /></p><div class="codebox"><pre><code>@echo off
setlocal

set sFile=0001.txt

if exist &quot;%sFile%&quot; (
    for /f &quot;usebackq tokens=1,2 eol=; delims==&quot; %%i in (&quot;%sFile%&quot;) do set %%i=%%j
)

if defined User echo %User%
if defined Password echo %Password%

endlocal
exit /b 0</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 02 Jan 2011 10:17:26 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=43262#p43262</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=43261#p43261</link>
			<description><![CDATA[<p>А как сделать так чтобы, содержимое первой строки передавалось переменной %sUser% а вторая строка в %sLogin%</p>]]></description>
			<author><![CDATA[null@example.com (Skrask)]]></author>
			<pubDate>Sun, 02 Jan 2011 06:28:06 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=43261#p43261</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=43260#p43260</link>
			<description><![CDATA[<p>Если будут вопросы — пишите, ничего страшного.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 02 Jan 2011 06:14:40 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=43260#p43260</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Работа с переменными]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=43259#p43259</link>
			<description><![CDATA[<p>alexii, поспешил я, сейчас точно во всём разобрался, спасибо что объяснил)</p>]]></description>
			<author><![CDATA[null@example.com (Skrask)]]></author>
			<pubDate>Sun, 02 Jan 2011 05:57:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=43259#p43259</guid>
		</item>
	</channel>
</rss>
