Показать полную графическую версию : [решено] сортировка по дате
BEL9ILLI
10-05-2010, 19:23
Собственно сабж. Нужно вывести в текстовый файл все файлы в данной директории созданные раньше заданной даты. Есть код, который выводит все файлы в в директории где лежит batник.
Как сделать сортировку по дате?
@echo off
mode con codepage select=1251 > nul
set name=%~1
if "%~1"=="" set /p name=Enter file name:
echo Please wait...
set ind=0
:next
set /a ind+=1
set tmp=
for /f "delims=\ tokens=%ind%" %%a in ("%~dp0") do set tmp=%%a
if not "%tmp%"=="" goto next
set /a ind-=1
if exist %name% del %name%
for /f "delims=\ tokens=%ind%*" %%a in ('dir *.* /b /s') do echo %%b >> %name%
mode con codepage select=866 > nul
if exist %name% start %name%
megaloman
10-05-2010, 20:35
Нужно вывести в текстовый файл все файлы в данной директории созданные раньше заданной даты. » Вот bat-файл, который выводит в файл список файлов, изменённых до указанного времени.
В выходном файле имена файлов по дате не отсортированы Echo Off
rem Определяем:
rem Дату. Отображаем файлы, изменённые ранее указанной.
rem Директорию и маску файлов имена которых выводятся в файл
rem Имя выходного файла
Set DateNew=05.12.2008
Set WhereFiles="E:\Delete\yyyyy\*.*"
Set WhereOutTxt="E:\Delete\Файлы_до_%DateNew:~6,4%%DateNew:~3,2%%DateNew:~0,2%.txt"
Set DN=%DateNew:~6,4%%DateNew:~3,2%%DateNew:~0,2%
Del %WhereOutTxt%
FOR %%i IN (%WhereFiles%) DO Call :Older "%%i"
GoTo End
:Older
Set DT=%~t1
Set DT=%DT:~6,4%%DT:~3,2%%DT:~0,2%
If %DT% LSS %DN% Echo %~t1 %~1>>%WhereOutTxt%
:End
megaloman
11-05-2010, 00:35
Вот vbs-скрипт, который выводит в файл список файлов, изменённых до указанного времени.
В выходном файле имена файлов отсортированы по дате. Наверное, можно сделать и bat-файл, например, на базе команды dir /O:D ? но что-то не очень очевидно как. ' Определяем:
DateNew = "05.12.2008" ' Дату. Отображаем файлы, изменённые ранее указанной.
inDir = "E:\Delete\yyyyy" ' Директорию c файлами имена которых выводятся в файл
WhereOutTxt = "E:\Delete\Файлы_до_" + Mid(DateNew, 7, 4) + Mid(DateNew, 4, 2) + Mid(DateNew, 1, 2) + ".txt" ' Имя выходного файла
Set FSO = CreateObject("Scripting.FileSystemObject") ' Создаём объект для доступа к файловой системе
DN = DateSerial(CInt(Mid(DateNew, 7, 4)), CInt(Mid(DateNew, 4, 2)), CInt(Mid(DateNew, 1, 2)))
Set F1 = FSO.OpenTextFile(WhereOutTxt, 2, True)
On Error Resume Next ' Обработаем ситуацию, если встретилась директория без доступа
Set F = FSO.GetFolder(inDir) ' Создаём объект для доступа к директории
If Err.Number = 0 Then
On Error GoTo 0
Set AllFiles = F.Files ' Для текущей директории создаём коллекцию файлов
N = AllFiles.Count
ReDim MNames(N - 1), MDates(N - 1), M(N - 1)
i = -1
For Each iFile In AllFiles ' Просматриваем файлы в директории
i = i + 1
M(i) = i
MNames(i) = iFile.Name
' MDates(i) = iFile.DateCreated ' Дата создания файла
' MDates(i) = iFile.DateLastAccessed ' Дата последнего доступа к файла
MDates(i) = iFile.DateLastModified ' Дата последней модификации файла
Next
For i = 0 To N - 1
For j = i To N - 1
If MDates(M(i)) > MDates(M(j)) Then
k = M(i)
M(i) = M(j)
M(j) = k
End If
Next
If DN > MDates(M(i)) Then
F1.WriteLine (Mid(CStr(MDates(M(i))) + " ", 1, 21) + MNames(M(i)))
Else
Exit For
End If
Next
Else
MsgBox inDir + vbCrLf + Err.Description, 0, "Проблемы с директорией"
End If
F1.Close
BEL9ILLI
11-05-2010, 00:43
вот в том то и проблема, но все равно спасибо.
Наверное, можно сделать и bat-файл, например, на базе команды dir /O:D ? но что-то не очень очевидно как.»да так же:
@Echo Off
Set _Date=20100101
Set _Mask=*.*
For /F "Delims=" %%i In ('DIR /B/OD %_Mask%') Do Set _D=%%~ti& Call :TestFile "%%i"
:TestFile
If Not "%~1"=="" If %_D:~6,4%%_D:~3,2%%_D:~0,2% LSS %_Date% Echo %~1
GoTo :EOF
BEL9ILLI
11-05-2010, 17:26
Код:
@Echo Off
Set _Date=20100101
Set _Mask=*.*
For /F "Delims=" %%i In ('DIR /B/OD %_Mask%') Do Set _D=%%~ti& Call :TestFile "%%i"
:TestFile
If Not "%~1"=="" If %_D:~6,4%%_D:~3,2%%_D:~0,2% LSS %_Date% Echo %~1
GoTo :EOF »
У меня этот вариант не заработал. Сделал как написал megaloman в первом посте, тока переделал немного в плане ввода данных.
megaloman
11-05-2010, 17:56
Вот bat-файл, который выводит в файл список файлов, изменённых до указанного времени.
В выходном файле имена файлов по дате отсортированы (Спасибо Amel27)
Изменения коснулись трёх строк (Del, For изменил, If добавил) . Echo Off
rem Определяем:
rem Дату. Отображаем файлы, изменённые ранее указанной.
rem Директорию и маску файлов имена которых выводятся в файл
rem Имя выходного файла
Set DateNew=26.04.2010
Set WhereFiles="E:\Delete\yyyyy\*.*"
Set WhereOutTxt="E:\Delete\Файлы_до_%DateNew:~6,4%%DateNew:~3,2%%DateNew:~0,2%.txt"
Set DN=%DateNew:~6,4%%DateNew:~3,2%%DateNew:~0,2%
Del %WhereOutTxt% >Nul 2>Nul
FOR /F "usebackq delims=" %%i IN (`Dir /B /O:D %WhereFiles%`) DO Call :Older "%%i"
GoTo End
:Older
If %1=="" GoTo End
Set DT=%~t1
Set DT=%DT:~6,4%%DT:~3,2%%DT:~0,2%
If %DT% LSS %DN% Echo %~t1 %~1>>%WhereOutTxt%
:End Я бы предложил всё-таки попробовать vbs-скрипт (переносите текст скрипта в блокнот, сохраняете как файл с расширением .vbs, запускаете как любой исполнимый файл, ничего дополнительно не нужно) Хоть скрипт будет работать медленнее, но экран дёргаться не будет как при запуске батника.
BEL9ILLI
11-05-2010, 21:34
да если бы я себе делал бы, то конечно vbs использовал, но надо именно батник.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.