<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; CMD: Экранирование восклицательного знака после enabledelayedexpansion]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5141&amp;type=atom" />
	<updated>2010-11-10T05:21:24Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=5141</id>
		<entry>
			<title type="html"><![CDATA[Re: CMD: Экранирование восклицательного знака после enabledelayedexpansion]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=41425#p41425" />
			<content type="html"><![CDATA[<p><strong>alexii</strong><br />Спасибо за ссылку, нашел там идею о переменной, которой прсвоен восклицательный знак.<br />Вот мой код: он удаляет старые бэкапы, исходя из заданного в скрипте количества(сами бекапы создаются сторонней программой). В моем случае имя файла представляло &quot;Copy date-time!.zip&quot;<br /></p><div class="codebox"><pre><code>@echo off
set n=0
set ex=!
setlocal enabledelayedexpansion
set LogFile=&quot;%~dp0\LogRotation.log&quot;


echo ============================================&gt;&gt;%LogFile%
echo %date% %time:~0,8%&gt;&gt;%LogFile%
echo ============================================&gt;&gt;%LogFile%

dir &quot;copy*.zip&quot; /b /tc /o-d&gt;&gt;%LogFile%
echo --------------------------------------------&gt;&gt;%LogFile%

for /f &quot;tokens=* usebackq&quot; %%i in (`dir &quot;copy*.zip&quot; /b /tc /o-d`) do (
    set /a n=!n! + 1
    if /i !n! GEQ 15 (
        echo Deleted &quot;%%i!!ex!.zip&quot;&gt;&gt;%LogFile%
        del /f &quot;%%i!!ex!.zip&quot;
    )
)
rem echo Done. See &quot;%LogFile%&quot; for more details.</code></pre></div>]]></content>
			<author>
				<name><![CDATA[md3k]]></name>
			</author>
			<updated>2010-11-10T05:21:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=41425#p41425</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD: Экранирование восклицательного знака после enabledelayedexpansion]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=41392#p41392" />
			<content type="html"><![CDATA[<p>Могу предложить следующий скрипт ротации файлов<br /></p><div class="codebox"><pre><code>@echo off

if    &quot;%~1&quot; == &quot;&quot;   goto help
if /i &quot;%~1&quot; == &quot;/h&quot; goto help

setlocal

if not &quot;%~2&quot; == &quot;&quot; set /a rotate_n=%~2 2&gt;nul
if not defined rotate_n set rotate_n=5
if %rotate_n% lss 5 set rotate_n=5

:: set rotate_c=copy /y
set rotate_0=copy nul
set rotate_c=move /y

set rotate_i=%rotate_n%

:loop_redo
set /a rotate_i-=1
if %rotate_i% == 0 goto loop_break

if exist &quot;%~1.%rotate_i%&quot; %rotate_c% &quot;%~1.%rotate_i%&quot; &quot;%~1.%rotate_n%&quot;

set /a rotate_n-=1
goto loop_redo
:loop_break

%rotate_c% &quot;%~1&quot; &quot;%~1.1&quot; &amp;&amp; %rotate_0% &quot;%~1&quot;

endlocal
goto :EOF

:help
echo.Usage:
echo.    %~n0 FILENAME [NUMBER]
goto :EOF</code></pre></div><p>Можно вызывать из другого скрипта. По умолчанию создает 5 файлов, добавляя очередную цифру к расширению. Второй (необязательный) параметр указывает размер очереди. <br /></p><div class="codebox"><pre><code>@echo off

:: Очередь равна 15 для каждого &quot;бекапируемого&quot; файла
for /f &quot;tokens=* usebackq&quot; %%i in (`dir &quot;a*.txt&quot; /b /tc /o-d`) do (
    call rotate &quot;%%~i&quot; 15
)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Rumata]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=24846</uri>
			</author>
			<updated>2010-11-09T14:07:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=41392#p41392</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: CMD: Экранирование восклицательного знака после enabledelayedexpansion]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=41390#p41390" />
			<content type="html"><![CDATA[<p>Не уверен, что подойдёт, но попробуйте воспользоваться этим: <a href="http://rsdn.ru/article/winshell/NTCommandProcessor.xml#EW2AE">Оператор “!” или оператор “%”?</a>. Или не используйте <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /> включение отложенного раскрытия переменных (раскрытие делать через вызов «call»). Либо, что будет более продуктивно, переходите на WSH/PoSH.</p><p>P.S. Насколько я помню, в «SET /A» использовать раскрытие (что «%», что «!») не требуется.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-11-09T13:50:54Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=41390#p41390</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[CMD: Экранирование восклицательного знака после enabledelayedexpansion]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=41389#p41389" />
			<content type="html"><![CDATA[<p>Всем привет, пишу скрипт для ротации бекапов. В имени присутсвует восклицательный знак, и от него никак не избавиться. Подскажите как можно экранировать его, иначе он пропадает и система не находит файл. Вот мой код<br /></p><div class="codebox"><pre><code>@echo off
set n=0
setlocal enabledelayedexpansion

for /f &quot;tokens=* usebackq&quot; %%i in (`dir &quot;copy*.zip&quot; /b /tc /o-d`) do (
    set /a n=!n! + 1
    echo !n!
    if /i !n! GEQ 15 (
        echo Deleted %%i
        del /f &quot;%%i&quot;
    )
)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[md3k]]></name>
			</author>
			<updated>2010-11-09T13:10:25Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=41389#p41389</id>
		</entry>
</feed>
