<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=9949&amp;type=atom" />
	<updated>2014-10-02T04:50:58Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=9949</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86934#p86934" />
			<content type="html"><![CDATA[<p>Таки да! Это же очевидно! Но почему-то споткнулся на этом.</p>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2014-10-02T04:50:58Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86934#p86934</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86933#p86933" />
			<content type="html"><![CDATA[<p>Это нормальное явление. Всё, что в скобках, выполняется одним блоком. Переменная %CD% подставляется ОДИН раз, перед выполнением блока. Чаще всего, такая ситуация возникает в многострочном FOR, но там этим не удивишь, здесь же то же самое.</p>]]></content>
			<author>
				<name><![CDATA[Smitis]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=5649</uri>
			</author>
			<updated>2014-10-01T19:39:48Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86933#p86933</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86297#p86297" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2014-09-05T08:57:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86297#p86297</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD/BAT: %CD% не всегда верно показывает текущий путь]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86295#p86295" />
			<content type="html"><![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>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2014-09-04T20:51:09Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86295#p86295</id>
		</entry>
</feed>
