<?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=8301</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=8301&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «CMD/BAT: Удаление пустого каталога».]]></description>
		<lastBuildDate>Tue, 14 May 2013 17:21:58 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72121#p72121</link>
			<description><![CDATA[<div class="quotebox"><cite>privatbox пишет:</cite><blockquote><p>Т.е. допустим, имеется 8 папок, а ему нужно встроить новую на место третьей и добавить в нее новые файлы.<br />Я перемещаю папку 008 в 009 и переименовываю содержащиеся в ней файлы, 007 в 008 ... 003 в 004,&nbsp; и создаю папку 003.</p></blockquote></div><p>Что-то много преобразований для одной &quot;транкзации&quot;, м.б. стоит переработать алгоритм? Или вы, в данном случае, работаете с данными, поступающими от другой программы (вид и структура данных зависит не от вас)?<br />Вообще в данном случае стоит задуматься о <a href="http://ru.wikipedia.org/wiki/%D0%96%D1%91%D1%81%D1%82%D0%BA%D0%B0%D1%8F_%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B0">жёстких ссылках (hardlink)</a>?<br /></p><div class="quotebox"><blockquote><p>Но, если какой либо файл из перемещаемых папок блокирован, выполнить откат становится затруднительно.</p></blockquote></div><p>Что-то вроде такого:<br /></p><div class="codebox"><pre><code>
:: renaming with rollback
set fromdir=001
set todir=002
set log=work.log
:: generate test data
call :generate
:: create moving log
call :prepare %fromdir%
for /f &quot;tokens=*&quot; %%a in (&#039;type %log%&#039;) do (
:: move
call :move %%a %fromdir% %todir%) 
:: rollback
for /f &quot;tokens=*&quot; %%a in (&#039;type %log%&#039;) do (
call :rollback %%a %fromdir% %todir%) 
exit /b

:generate
if exist %fromdir% rd /s/q %fromdir%
if exist %todir% rd /s/q %todir%
md %fromdir%
md %todir%
for /l %%a in (1,1,99) do (echo.&gt;%fromdir%\%%a.file)
for /l %%a in (101,1,199) do (echo.&gt;%todir%\%%a.file)
exit /b

:prepare
dir /b /a /s %1 &gt; %log%
exit /b

:move
setlocal enabledelayedexpansion
set name=%1
move /y !name! !name:%2=%3!
exit /b &amp; endlocal

:rollback
setlocal enabledelayedexpansion
set name=%1
move /y !name:%2=%3! !name! 
exit /b &amp; endlocal
</code></pre></div><div class="quotebox"><blockquote><p>Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.<br />Но оставлять каталог ТЕМР в рабочей директории нельзя!<br />Как его удалить?<br />...<br />Я это понял так, что перемещение каталога доступно лишь в пределах одного диска, а %TEMP% расположена именно на системном.</p></blockquote></div><p>Как вариант (<strong>robocopy</strong> в составе ОС, начиная с Vista и новее):<br /></p><div class="codebox"><pre><code>
robocopy &quot;from&quot; &quot;to&quot; /mov
</code></pre></div><p>или<br /></p><div class="codebox"><pre><code>
robocopy &quot;from&quot; &quot;to&quot; /move
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Tue, 14 May 2013 17:21:58 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72121#p72121</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72094#p72094</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Но команда незнакомая. Где можно почитать о ней?</p></blockquote></div><p>Как обычно:<br /></p><div class="codebox"><pre><code>rd /?</code></pre></div><p>Или в справке (зависит от ОС).</p><div class="quotebox"><blockquote><p>Я это понял так, что перемещение каталога доступно лишь в пределах одного диска,</p></blockquote></div><p>Именно.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 13 May 2013 19:20:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72094#p72094</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72088#p72088</link>
			<description><![CDATA[<div class="quotebox"><cite>UNDYING пишет:</cite><blockquote><div class="codebox"><pre><code>
rd /s/q &quot;path_to_TEMP_directory&quot;
</code></pre></div></blockquote></div><p>Спасибо, работает! <br />Но команда незнакомая. Где можно почитать о ней?<br /></p><div class="quotebox"><blockquote><p>А почему не устраивает другой диск?</p></blockquote></div><p> <br />Если системный диск С: а рабочая директория на другом диске, то при попытке выполнить MOVE &quot;D:\path_directory&quot; %TEMP% получаю сообщение &quot;Отказано в доступе&quot;.&nbsp; Я это понял так, что перемещение каталога доступно лишь в пределах одного диска, а %TEMP% расположена именно на системном.<br /></p><div class="quotebox"><blockquote><p>Попытаться прочесть файлы (или проверить handle, утилитой от М.Руссиновича)</p></blockquote></div><p>1.&nbsp; Каждая из 00N папок содержит еще целое дерево директорий и файлов там чертова туча. Проверять каждый - поседеешь. А MOVE, раз - и готово. <br />2. По техзаданию должно быть не более 3 файлов, .bat .ini .dat .&nbsp; Поначалу требовали вообще одним батником ограничиться, но тут уж я рогом уперся.</p><p>Еще раз хочу искренне поблагодарить за помощь!<br />И <strong>Rom5 </strong>тоже!</p>]]></description>
			<author><![CDATA[null@example.com (privatbox)]]></author>
			<pubDate>Mon, 13 May 2013 17:17:14 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72088#p72088</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72086#p72086</link>
			<description><![CDATA[<p><em>offtop</em><br />Если вопрос не стоит ребром о том, что делать &quot;сдвиг&quot; имен папок надо именно в своей программе, то можно пользователю предложить воспользоваться сторонними утилитами. </p><p>Например, в менеджере &quot;<strong>Total Commander</strong>&quot; есть очень удобная утилитка пакетного переименования - <strong>Multi-Rename Tool</strong> вызываемая по Ctrl+M после отметки переименовываемых файлов/директорий. </p><p>В качестве будущих имен можно взять часть предыдущего имени плюс счетчик с указанием начального значения. Если из утилиты еще не вышли - можно выполнить откат переименования.</p><p>Вот, скриншот:<br /><a href="http://savepic.net/3615408.htm"><span class="postimg"><img src="http://savepic.net/3615408m.png" alt="http://savepic.net/3615408m.png" /></span></a></p><p>...</p><div class="quotebox"><cite>UNDYING пишет:</cite><blockquote><div class="quotebox"><blockquote><p>Поначалу использовал %ТЕМР% и все было гладко до тех пор, <strong>пока рабочая директория размещалась на системном диске.</strong> <br />А какой диск предпочтет пользователь неизвестно...</p></blockquote></div><p>А почему не устраивает другой диск? К примеру, мне удобно использовать (и переопределять в скриптах - для отладки) некоторые переменные оболочки, в т.ч. %TMP% и %TEMP%? К чему такая категоричность и почему это так важно, ведь &quot;временная директория&quot; на то и &quot;временная&quot;? В вашей записи я ответа не нашёл.</p></blockquote></div><p>Не устраивает видимо тем, что рабочая папка и системная &quot;тэмповая&quot; могут получиться на разных томах, что приведет при &quot;переименованиях&quot; к физическому перемещению туда и обратно папок пользователя со всем содержимым, т.е. времязатратно...</p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Mon, 13 May 2013 14:58:06 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72086#p72086</guid>
		</item>
		<item>
			<title><![CDATA[Re: CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72084#p72084</link>
			<description><![CDATA[<div class="quotebox"><cite>privatbox пишет:</cite><blockquote><p>Привет честной компании!<br />Нарисовалась проблема, голову сломал...</p></blockquote></div><p>Привет и вам.<br /></p><div class="quotebox"><blockquote><p>В рабочей директории содержится ряд папок с именами 001; 002 и т.д.&nbsp; В папках фалы, имя которых должно включать в себя имя папки.<br />По умолчанию программа добавляет новые файлы в папку с последним номером.<br />Но в процессе работы у пользователя возникает необходимость вставить новую папку между сущесвующими.</p></blockquote></div><p>Может быть <em>составите алгоритм</em> или <em>представите код</em>? Потому как у меня вырисовывается такая картина:</p><ol class="decimal"><li><p>Получить список имеющихся папок</p></li><li><p>Получить имя папки, если такой нет, то создать, иначе: <br /></p><ul><li><p>Попытаться прочесть файлы (или проверить handle, утилитой от М.Руссиновича), если всё ок - переместить файлы из &quot;исходной&quot; директории в &quot;исходная+1&quot;</p></li><li><p>иначе вывести предупреждение или &quot;покиллять&quot; приложения, открывшие файлы</p></li></ul></li><li><p>-&gt; п.1</p></li></ol><div class="quotebox"><blockquote><p>Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.<br />Но оставлять каталог ТЕМР в рабочей директории нельзя!<br />Как его удалить?<br />Насколько мне известно, CMD такой возможности не предоставляет. Но может, кто либо подскажет какой либо иной вариант?</p></blockquote></div><div class="codebox"><pre><code>
rd /s/q &quot;path_to_TEMP_directory&quot;
</code></pre></div><div class="quotebox"><blockquote><p>Поначалу использовал %ТЕМР% и все было гладко до тех пор, <strong>пока рабочая директория размещалась на системном диске.</strong> <br />А какой диск предпочтет пользователь неизвестно...</p></blockquote></div><p>А почему не устраивает другой диск? К примеру, мне удобно использовать (и переопределять в скриптах - для отладки) некоторые переменные оболочки, в т.ч. %TMP% и %TEMP%? К чему такая категоричность и почему это так важно, ведь &quot;временная директория&quot; на то и &quot;временная&quot;? В вашей записи я ответа не нашёл.</p>]]></description>
			<author><![CDATA[null@example.com (UNDYING)]]></author>
			<pubDate>Mon, 13 May 2013 14:36:37 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72084#p72084</guid>
		</item>
		<item>
			<title><![CDATA[CMD/BAT: Удаление пустого каталога]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=72067#p72067</link>
			<description><![CDATA[<p>Привет честной компании!<br />Нарисовалась проблема, голову сломал...<br />В рабочей директории содержится ряд папок с именами 001; 002 и т.д.&nbsp; В папках фалы, имя которых должно включать в себя имя папки.<br />По умолчанию программа добавляет новые файлы в папку с последним номером.<br />Но в процессе работы у пользователя возникает необходимость вставить новую папку между сущесвующими. <br />Т.е. допустим, имеется 8 папок, а ему нужно встроить новую на место третьей и добавить в нее новые файлы.<br />Я перемещаю папку 008 в 009 и переименовываю содержащиеся в ней файлы, 007 в 008 ... 003 в 004,&nbsp; и создаю папку 003.<br />Но, если какой либо файл из перемещаемых папок блокирован, выполнить откат становится затруднительно.<br />Решил в качестве проверки перемещать без переименовывания в вновь создаваемую в рабочей директории папку ТЕМР, и в случае успешного завершения возвращать в рабочую директорию с новыми именами.<br />Но оставлять каталог ТЕМР в рабочей директории нельзя!<br />Как его удалить?<br />Насколько мне известно, CMD такой возможности не предоставляет. Но может, кто либо подскажет какой либо иной вариант?<br />Поначалу использовал %ТЕМР% и все было гладко до тех пор, пока рабочая директория размещалась на системном диске. <br />А какой диск предпочтет пользователь неизвестно...</p>]]></description>
			<author><![CDATA[null@example.com (privatbox)]]></author>
			<pubDate>Mon, 13 May 2013 11:52:07 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=72067#p72067</guid>
		</item>
	</channel>
</rss>
