<?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: %CD% не всегда верно показывает текущий путь]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=9949</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9949&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: %CD% не всегда верно показывает текущий путь».]]></description>
		<lastBuildDate>Thu, 02 Oct 2014 04:50:58 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86934#p86934</link>
			<description><![CDATA[<p>Таки да! Это же очевидно! Но почему-то споткнулся на этом.</p>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 02 Oct 2014 04:50:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86934#p86934</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86933#p86933</link>
			<description><![CDATA[<p>Это нормальное явление. Всё, что в скобках, выполняется одним блоком. Переменная %CD% подставляется ОДИН раз, перед выполнением блока. Чаще всего, такая ситуация возникает в многострочном FOR, но там этим не удивишь, здесь же то же самое.</p>]]></description>
			<author><![CDATA[null@example.com (Smitis)]]></author>
			<pubDate>Wed, 01 Oct 2014 19:39:48 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86933#p86933</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86297#p86297</link>
			<description><![CDATA[<p><strong>Rumata</strong>, а если так:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>@echo off

setlocal

echo:==== OK====
pushd &quot;%~dpn0\test2&quot;
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd &quot;%~dpn0\test2&quot;
    call echo:%%CD%%
    cd
    popd
    call echo:%%CD%%
    cd
)
</code></pre></div></div></div><p>или так:<br /></p><div class="fancy_spoiler_switcher"><div class="fancy_spoiler_switcher_header" data-lang-open="открыть спойлер" data-lang-close="скрыть спойлер"><strong>+</strong>&nbsp;открыть спойлер</div><div class="fancy_spoiler"><div class="codebox"><pre><code>@echo off
setlocal enableextensions enabledelayedexpansion

echo:==== OK====
pushd &quot;%~dpn0\test2&quot;
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd &quot;%~dpn0\test2&quot;
    echo:!CD!
    cd
    popd
    echo:!CD!
    cd
)

endlocal
exit /b 0
</code></pre></div></div></div><p>?</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Fri, 05 Sep 2014 08:57:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86297#p86297</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86295#p86295</link>
			<description><![CDATA[<p>Выдержка из описания команды <strong>set /?</strong>:<br /></p><div class="quotebox"><blockquote><p>%CD% - expands to the current directory string.</p></blockquote></div><p>То есть, переменная должна указывать на текущий каталог. Но это не всегда верно. Например, если вы запустили некоторый скрипт из другого каталога и выполняете переход в другой каталог в цикле или подпроцессе (как правильно назвать блок команд в круглых скобках?) переменная %CD% будет указывать на исходный каталог, находясь в котором вы вызвали скрипт. </p><p><strong>Пример</strong><br />создайте каталог C:\tmp\test1\test2<br />создайте файл скрипта C:\tmp\test1.bat (см. ниже)<br />в консоли перейдите в любой другой каталог и запустите файл</p><div class="codebox"><pre><code>
@echo off

setlocal

echo:==== OK====
pushd &quot;%~dpn0\test2&quot;
echo:%CD%
cd
popd
echo:%CD%
cd

(
    echo:==== FAIL ====
    pushd &quot;%~dpn0\test2&quot;
    echo:%CD%
    cd
    popd
    echo:%CD%
    cd
)
</code></pre></div><div class="quotebox"><blockquote><p>C:\Windows&gt;c:\tmp\test1.bat<br />==== OK ====<br /><span style="color: green">c:\tmp\test1\test2</span><br /><span style="color: green">c:\tmp\test1\test2</span><br />C:\Windows<br />C:\Windows<br />==== FAIL ====<br /><span style="color: red">C:\Windows</span><br /><span style="color: green">c:\tmp\test1\test2</span><br />C:\Windows<br />C:\Windows</p></blockquote></div><p>Предлааемое решение</p><p>Команда <strong>cd</strong> возвращает правильное значение для текущего пути. Казалось бы в чем проблема - используй ее? Но ведь это очередная ошибка или недокументированная особенность и лишние телодвижения при разработке. </p><p>Закрыть проблему можно с помощью отдельной подпрограммы. Хотя это может показаться тоже не очень удобно. </p><div class="codebox"><pre><code>
@echo off

setlocal

call :cd

(
    call :cd
)
goto :EOF

:cd
echo:==== OK ====
pushd &quot;%~dpn0\test2&quot;
echo:%CD%
cd
popd
echo:%CD%
cd
goto :EOF
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Rumata)]]></author>
			<pubDate>Thu, 04 Sep 2014 20:51:09 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86295#p86295</guid>
		</item>
	</channel>
</rss>
