Форум на Kuban.ru (http://forums.kuban.ru/)
-   Сети и их администрирование (http://forums.kuban.ru/f1029/)
-   -   OFF. Помогите допилить батник. (http://forums.kuban.ru/f1029/off_pomogite_dopilit-_batnik-1998512.html)

Disobedient 26.12.2011 14:23

OFF. Помогите допилить батник.
 
Когда я его только садился писать, то создал тему на "Разработка программ", но меня сразу "послали" сюда.
Батник я собрал, работает, смысл его:
1. После запуска в папке 053 создаётся папка с текущей датой.
2. С флешки копируются данные в эту папку.
3. Файлы с флехи удаляются.
4. Если "возраст" папки > 5 дней, то эта папка удаляется.
5. Флешка извлекается.

Вся проблема в п. 4.
Если папка с датой в корневике диска, то проблем нет, но вот в самой папке 053, то ничего естественно не удаляется.
Подскажите, пожалуйста, что нужно дописать?

@echo off
SetLocal EnableDelayedExpansion

set SRC=W:Adr
set DST=V:053

call :FromNow -7
xcopy /q/y "%SRC%\*" "%DST%\%DATE:~,5%.%DATE:~-2%\"
for /d %%i in (%DST%\*) do (
set $i=%%~ni& set "$i=!$i:~-2!!$i:~3,2!!$i:~,2!"
if !$i! lss %yymmdd% rd /s/q "%%i"
)

Erase /S /Q W:\Adr

call USB_Disk_Eject.exe /REMOVETHIS /SHOWEJECT

:FromNow
SetLocal
Set yyyy=%DATE:~-4%& set /a mm=100%DATE:~3,2%%%100& set /a dd=100%DATE:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set yymmdd=%yyyy:~-2%%mm:~-2%%dd:~-2%
Exit /B

Disobedient 26.12.2011 14:55

Что то подсказывает, что проблем в [b]SetLocal[/b]
14 строка...

Flukostat 26.12.2011 15:26

Я что-то не догнал, зачем такая сложность в FromNow.
Нельзя там что-то попроще, например:
strDate = Datepart("yyyy",Date()) & right("0"&Datepart("m",Date()),2) & right("0"&Datepart("d",Date()),2) ?

Flukostat 26.12.2011 15:28

Ааа, сорри, догнал, это ж батник, а не vbscript :)

LeXX 26.12.2011 16:25

4-Flukostat >Второй вопрос - почему нельзя использовать wsh? :-)

Flukostat 26.12.2011 17:23

Походу я их не различаю, для меня что wscript, что cscript, одна малина, только w он еще, вроде, окошки диалоговые выводит. А так - хз, оба обрабатывают vbs-файлы :)

Flukostat 26.12.2011 17:24

PS Автор, а ведь, походу, на скриптах задача решается быстро и дешево. в отличие от батника :)

Гинзбург 26.12.2011 18:06

расшифровать ?
cmd /c "for /f "delims=" %i in ('dir /a:d /b *') do echo %~ti %~i"

Гинзбург 26.12.2011 18:11

нужна разница дат ?

ruvirus 27.12.2011 02:08

говенный скрипт, он будет работать, если флешка будет под буквой W, а если нет?

Гинзбург 27.12.2011 06:02

(10)
mountvol /l

Disobedient 27.12.2011 07:45

10-ruvirus >всё прикольно работает.
Задать флехе постоянно W
@echo off
cd /d c:
for /f "tokens=*" %%a in (' mountvol %~d0 /l ') do ( mountvol %~d0 /d & mountvol W: %%a & exit )

system32 27.12.2011 08:52

Батники - каменный век. На Power Shell можно например так:
$folder = c:\temp
$a = Get-Date
$b = Get-Item $folder
$c = $a - $b.LastWriteTime
if ($a>5){Remove-Item $folder**

Как-то так. Можно конечно и в одну строчку :)

Disobedient 27.12.2011 12:27

13-system32 >хорошо, обещаю изучить)
А пока надо батник доделать, чтоб процесс не останавливался.

Гинзбург 27.12.2011 13:16

этот "каменный век" еще сто в очко фору даст всем повершелам и башам

Гинзбург 27.12.2011 13:18

а форфалес не просче ли изучить ?
по сабжу так и нет понимания проблемы

Disobedient 27.12.2011 13:35

:FromNow
SetLocal
Set yyyy=%DATE:~-4%& set /a mm=100%DATE:~3,2%%%100& set /a dd=100%DATE:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal& Set yymmdd=%yyyy:~-2%%mm:~-2%%dd:~-2%
Exit /B
Удаляет папки с датами, если они в корне диска V
Если V:\053, то не удаляет.

Гинзбург 27.12.2011 13:43

так пойдет или принципиально исправить сабж ?
set DST=V:\053
forfiles /d -7 /p "%dst%" /c "cmd /c if @isdir==TRUE rd /s/q @path"

Disobedient 27.12.2011 16:07

"forfiles" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Гинзбург 27.12.2011 16:58

... (%DST%\*) ...
...
... rd /s /q "%%~dpnxi"

Гинзбург 27.12.2011 16:59

.. ("%DST%\*") ...

Гинзбург 27.12.2011 17:00

разница в днях вычисляется конечно просче и еще много чего, но не ссут

Disobedient 28.12.2011 18:14

20-Гинзбург >Может я чего недопонимаю, но не работает...

Mikhalyich 29.12.2011 15:26

19-Disobedient > forfiles идет в составе серверных решений, можно скопировать в систем32 сию прогу и работать спокойно

Disobedient 30.12.2011 07:53

24-Mikhalyich >это рассматривал, forfiles.exe работает, но он удаляет только файлы, а их в папке около 200 шт. Мне нужно удалять сразу каталоги целиком.

Disobedient 30.12.2011 09:14

В общем так, отдельный батник "засунутый" в планировщик
@echo off
SetLocal EnableExtensions

set BackUp=V:\053
set Num=5

pushd %BackUp%
for /f "tokens=* delims=" %%D in ('dir /ad /b /o-d') do call :Proceed "%%D"
popd
exit

:Proceed
if not %Num%==0 set /a Num-=1&exit /b
echo %date% %time%: Erase %1>>%~dpn0.log
rd /s /q %1 2>nul >nul
exit /b

gloomymen 30.12.2011 10:20

[em]этот "каменный век" еще сто в очко фору даст всем повершелам и башам[/em]
с тобой сложно спорить, но 4 пункт в баше будет одной командой

Flukostat 30.12.2011 10:26

27>Кончай спорить под новый год. Лучше зайку с ДВ поздравь:)


Текущее время: 23:03. Часовой пояс GMT +3.