CMD/BAT - [решено] сортировка по дате

Ответить
Аватара пользователя
BEL9ILLI

CMD/BAT - [решено] сортировка по дате

Сообщение BEL9ILLI »

Собственно сабж. Нужно вывести в текстовый файл все файлы в данной директории созданные раньше заданной даты. Есть код, который выводит все файлы в в директории где лежит 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

Re: CMD/BAT - [решено] сортировка по дате

Сообщение megaloman »

Цитата BEL9ILLI:



Нужно вывести в текстовый файл все файлы в данной директории созданные раньше заданной даты.
CMD/BAT - [решено] сортировка по дате




Вот 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

Re: CMD/BAT - [решено] сортировка по дате

Сообщение megaloman »

Вот 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

Re: CMD/BAT - [решено] сортировка по дате

Сообщение BEL9ILLI »

вот в том то и проблема, но все равно спасибо.
Аватара пользователя
BEL9ILLI

Re: CMD/BAT - [решено] сортировка по дате

Сообщение BEL9ILLI »

Цитата megaloman:



Наверное, можно сделать и bat-файл, например, на базе команды dir /O:D ? но что-то не очень очевидно как.
CMD/BAT - [решено] сортировка по дате




да так же:



Код:

Код: Выделить всё

@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

Re: CMD/BAT - [решено] сортировка по дате

Сообщение BEL9ILLI »

Цитата amel27:



Код:

@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
CMD/BAT - [решено] сортировка по дате




У меня этот вариант не заработал. Сделал как написал megaloman в первом посте, тока переделал немного в плане ввода данных.
Аватара пользователя
megaloman

Re: CMD/BAT - [решено] сортировка по дате

Сообщение megaloman »

Вот 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

Re: CMD/BAT - [решено] сортировка по дате

Сообщение BEL9ILLI »

да если бы я себе делал бы, то конечно vbs использовал, но надо именно батник.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»