Компьютерный форум 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=175336)

BEL9ILLI 10-05-2010 19:23 1410468

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

Цитата:

Цитата BEL9ILLI
Нужно вывести в текстовый файл все файлы в данной директории созданные раньше заданной даты. »

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

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

вот в том то и проблема, но все равно спасибо.

amel27 11-05-2010 07:51 1410684

Цитата:

Цитата megaloman
Наверное, можно сделать и 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 1411062

Цитата:

Цитата 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 »

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

megaloman 11-05-2010 17:56 1411088

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

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


Время: 12:57.

Время: 12:57.
© OSzone.net 2001-