Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Удаление по дате (http://forum.oszone.net/showthread.php?t=263727)

greenOwl 04-07-2013 11:53 2179135

Удаление по дате
 
Добрый день!
Нашел статью Ссылочка, там удаление папок старше n дней, но поиск делается по маске имени, можно ли сделать, что бы удаление было по дате создания ?

Код:

@Echo Off

Set Arhiv=D:\arhiv
Set DeltaDay=-10

SetLocal EnableDelayedExpansion
Call :FromNow %DeltaDay% %Date%

FOR /F "usebackq delims=" %%d IN (`Dir "%Arhiv%\" /A:D /B`) DO If %%d LSS %yyyymmdd% Rd "%Arhiv%\%%d" /s /q
GoTo :Eof

:FromNow
rem
rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd
rem
rem Пример использования
rem
rem SetLocal EnableDelayedExpansion
rem Set DeltaDay=-10
rem Call :FromNow %DeltaDay% %Date%
rem Echo %Date%  %DeltaDay%  %yyyymmdd%

 SetLocal
 Set DT=%2
 Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,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 yyyymmdd=%yyyy%%mm:~-2%%dd:~-2%
GoTo :Eof


greenOwl 04-07-2013 14:00 2179228

Ну или хотя бы, подскажите, где нужно писать имя папок... например, если мне нужно удалить все папки старше даты d , которые имеют вид base-d

sunnykey 04-07-2013 14:02 2179231

Код:

#Powershell script.
#Don't forget unlock script executing by
#using command "Set-ExecutionPolicy RemoteSigned" or "Set-ExecutionPolicy Unrestricted"
#Save this file with ".ps1" extension
##########################
#перемеменная OlderThan отвечает за разницу дней от текущей даты,
# в данном примере старше 40 дней
$OlderThan=New-TimeSpan -Days 40
Get-ChildItem -LiteralPath 'C:\My Folder' -Directory | `
    Where-Object {$_.CreationTime -gt ((Get-Date)-$OlderThan)} | `
    Remove-Item -Force -Recurse

На powershell очень просто решается эта задача

greenOwl 04-07-2013 14:30 2179246

Цитата:

Цитата sunnykey
На powershell очень просто решается эта задача »

К сожалению, нужна универсальность в версиях окон.... а на ХП нет "powershell"

Как я понимаю, достаточно в строке
Код:

FOR /F "usebackq delims=" %%d IN (`Dir "%Arhiv%\" /A:D /B`) DO If %%d LSS %yyyymmdd% Rd "%Arhiv%\%%d" /s /q
Изменить "%Arhiv%\%%d" на "%Arhiv%\base-%%d" но это не работает :(
Значит, так делать нельзя, потому, что переменную %%d - нельзя так "соединять" с простыми символами, хоть весь путь и стоит в ""....
Как же тогда это сделать ?

sunnykey 04-07-2013 14:46 2179255

Цитата:

Цитата greenOwl
К сожалению, нужна универсальность в версиях окон.... а на ХП нет "powershell" »

Установочный пакет локализованной версии Windows PowerShell 1.0 для ОС Windows XP (KB926140)

greenOwl 04-07-2013 14:51 2179260

в таком случае, можно кинуть ссылку на винду 7 и не париться :)
нет, хочется, что бы было без установок дополнительного ПО ...

megaloman 04-07-2013 15:25 2179284

Код:

@Echo Off
cls

Set "DelDate=20140713"

SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%i IN (`Dir /B /T:C /A:D *.* 2^>nul`) DO (
        Set DDir=%%~ti
        Set DDir=!DDir:~6,4!!DDir:~3,2!!DDir:~0,2%!
        If !DDir! LSS %DelDate% @echo Rd "%%i" /S /Q
)

В DelDate вводим дату, после которой папки надо убить, в формате ггггммдд.
Батник в корне той папки, где удаляем подпапки.
Для реального удаления уберите @echo перед RD

greenOwl 04-07-2013 15:50 2179293

megaloman, да нет, мне нужно не много переделать именно тот код, который написан в первом сообщении...
просто папки будут содержать названия типа "НазваниеБазы_ддммгггг", а вот сам батник будет формироваться другой программой.... которая будет вносить путь и какой давности папки нужно удалить....

Iska 04-07-2013 16:14 2179313

Цитата:

Цитата greenOwl
на ХП нет "powershell" »

Для Windows XP есть PowerShell. И даже вторая версия (а не только та, что по ссылке выше).

Цитата:

Цитата greenOwl
нет, хочется, что бы было без установок дополнительного ПО ... »

Пора привыкать пользовать. Особенно, если всё ещё держите Windows XP.

greenOwl 04-07-2013 16:33 2179328

Iska, в том и дело, что я это делаю не себя, батник будет формироваться автоматически и прописываться в планировщик заданий... а версию ОС выбирать не приходится, может быть как ХП, так и 7, да еще и прав нужных может не быть... + ценнее будет, если на автомате ничего лишнего в ОС пихаться не будет....

я как бы могу просто сделать для каталога подкаталог с нужным названием, а в нем уже только даты.... но хочется покрасивее...
Просто подумал, что если уже алгоритм реализован, будет не сложно в название полного имени добавить пару символов перед переменной даты, но кажется, что это проблема :sorry:

Iska 04-07-2013 16:43 2179334

greenOwl, PowerShell — не лишнее. Это нынешнее средство администрирования, пришедшее на смену пакетным файлам и WSH.

megaloman 04-07-2013 16:54 2179345

Цитата:

там удаление папок старше n дней, но поиск делается по маске имени, можно ли сделать, что бы удаление было по дате создания ?
Если по дате создания, а дату надо выдернуть из имени "НазваниеБазы_ддммгггг", то, при условии, что в папке, где хранятся удаляемые подпапки, кроме них нет папок с иными именами
Код:

@Echo Off
cls

Set "DelDate=20140713
Set "Where=D:\tralala\kuku"

SetLocal EnableExtensions EnableDelayedExpansion

FOR /F "usebackq delims=" %%i IN (`Dir /B /T:C /A:D "%Where%\*.*" 2^>nul`) DO (
        Set DDir=%%~ti
        Set DDir=!DDir:~-10!
        Set DDir=!DDir:~4,4!!DDir:~2,2!!DDir:~0,2%!
        If !DDir! LSS %DelDate% @echo Rd "%Where%\%%i" /S /Q
)

Цитата:

мне нужно не много переделать именно тот код, который написан в первом сообщении...
ИМХО, разные задачи - разный код, зачем городить огород избыточными средствами?

greenOwl 05-07-2013 16:39 2179839

Извиняюсь, не увидел вторую страницу :o
Всем спасибо!


Время: 10:29.

Время: 10:29.
© OSzone.net 2001-