 |
|
Удаление по дате
Добрый день!
Нашел статью Ссылочка, там удаление папок старше 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
|
Ну или хотя бы, подскажите, где нужно писать имя папок... например, если мне нужно удалить все папки старше даты d , которые имеют вид base-d
|
Код:
#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 очень просто решается эта задача
|
Цитата:
Цитата 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 - нельзя так "соединять" с простыми символами, хоть весь путь и стоит в ""....
Как же тогда это сделать ?
|
в таком случае, можно кинуть ссылку на винду 7 и не париться :)
нет, хочется, что бы было без установок дополнительного ПО ...
|
Код:
@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
|
megaloman, да нет, мне нужно не много переделать именно тот код, который написан в первом сообщении...
просто папки будут содержать названия типа "НазваниеБазы_ддммгггг", а вот сам батник будет формироваться другой программой.... которая будет вносить путь и какой давности папки нужно удалить....
|
Для Windows XP есть PowerShell. И даже вторая версия (а не только та, что по ссылке выше).
Цитата:
Цитата greenOwl
нет, хочется, что бы было без установок дополнительного ПО ... »
|
Пора привыкать пользовать. Особенно, если всё ещё держите Windows XP.
|
Iska, в том и дело, что я это делаю не себя, батник будет формироваться автоматически и прописываться в планировщик заданий... а версию ОС выбирать не приходится, может быть как ХП, так и 7, да еще и прав нужных может не быть... + ценнее будет, если на автомате ничего лишнего в ОС пихаться не будет....
я как бы могу просто сделать для каталога подкаталог с нужным названием, а в нем уже только даты.... но хочется покрасивее...
Просто подумал, что если уже алгоритм реализован, будет не сложно в название полного имени добавить пару символов перед переменной даты, но кажется, что это проблема :sorry:
|
greenOwl, PowerShell — не лишнее. Это нынешнее средство администрирования, пришедшее на смену пакетным файлам и WSH.
|
Цитата:
там удаление папок старше 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
)
Цитата:
мне нужно не много переделать именно тот код, который написан в первом сообщении...
|
ИМХО, разные задачи - разный код, зачем городить огород избыточными средствами?
|
Извиняюсь, не увидел вторую страницу :o
Всем спасибо!
|
Время: 10:29.
© OSzone.net 2001-