2014-02-19 3 views
1

занимается исследованиями в течение всего дня, и я, вероятно, мог бы сделать это вручную, но я просто хочу, чтобы узнать, как это сделать, чтобы расширить мои знаниясписок со всеми DIRS + дата файла с старейшей дата последнего изменения

ТРЕБОВАНИЯ: У меня есть папка с подпапками 11xxx, мне нужно знать, когда последний файл в каждой из этих подпапок был последним изменен

До сих пор я пытался использовать команду dir для получения списка всех папок и последней измененной даты каждый из файлов в папке

echo Starting... 
@echo off 
if exist files.txt (del files.txt) 
dir /on /s /tw /a-d | find /v "<DIR>   ." | find /v "File(s)" > files.txt 
if exist files1.txt (del files1.txt) 
For /F "delims=" %%A in (files.txt) Do Echo %%A >> files1.txt 
if exist files2.txt (del files2.txt) 
For /F "skip=2 delims=*" %%A in (files1.txt) Do Echo %%A >> files2.txt 
@echo on 
echo Finishing... 
del files.txt 
del files1.txt 
ren files2.txt files.txt 
quit 

ИТАК выше дал мне текстовый файл в этом формате

Directory of C:\TEMP 
2013/12/05 05:30 PM   22,528 6N85.mst 
2011/06/21 12:01 PM  14,108,096 CitrixOnlinePluginWeb.exe 
2014/02/19 01:59 PM    448 extract.cmd 
2014/02/19 03:42 PM     0 files.txt 
2011/08/04 08:41 AM    216 GLF1C8.tmp 
2011/08/04 08:41 AM    2,630 GLF1C9.tmp 
2011/08/04 08:41 AM    54 GLF1CA.tmp 
2011/08/04 08:41 AM    64 GLF1CB.tmp 
2011/07/05 12:29 PM   239,174 ITMURebootMSG.EXE 
2013/11/28 04:20 PM   2,434,048 msxml.msi 
2013/11/28 12:59 PM   2,066,376 msxml4-KB2758694-enu.exe 
2004/04/15 10:10 AM    79 process.bat 
2012/08/02 12:43 AM    4,594 process.log 
2003/11/04 10:17 AM    376 procs.vbs 
2014/02/18 03:32 AM   16,391 WakeUpAgt.LO_ 
2014/02/19 12:04 PM    9,247 WakeUpAgt.LOG 
2005/03/09 09:40 AM   4,630,256 WindowsXP-KB895200-x86-ENU.exe 
2005/10/12 02:06 PM   4,934,896 WINDOWSXP-KB902400-X86-ENU.exe 
2006/05/25 12:12 PM   1,307,376 WindowsXP-KB913580-x86-ENU.exe 
    Total Files Listed: 
       0 Dir(s) 81,741,336,576 bytes free 

Я открыл текстовый файл в Excel, чтобы получить первые 10 символов каждой строки, чтобы получить дату в Col А,

ИМО этот подход неправильный, может быть, я должен делать это по-другому, кто-нибудь может помочь?

ответ

0

Прежде всего, спасибо @Mark за то, что помогли мне разобраться в циклах в dos, у меня были проблемы с ними вчера, и я просто не мог понять, как они работают, но теперь я думаю, что понимаю!

одна из проблем, которые я нашел с %%~tx том, что он не извлечь дату последнего изменения, только дату последнего обращения, может быть, я ошибаюсь, но я решил попробовать другой подход anwyay

::delete any files called list.txt if they exist 
if exist list.txt (del list.txt) 

::loop through all directories including sub-directories 
for /d /r %%x in (*) do (
    if exist listTemp1.txt (del listTemp1.txt) 

    ::loop through each file within directory, show time last written, sort desc 
    for /f "delims=" %%y in ('dir "%%x" /tw /o-d') do (
     ::append listTemp1.txt with list of files 
     echo %%y >> listTemp1.txt 
    ) 

    if exist listTemp2.txt (del listTemp2.txt) 

    ::append listTemp2.txt with lines containing/in the dates 
    find "/" listTemp1.txt >> listTemp2.txt 

    ::loop through listTemp2.txt to get last line of file, no delims as the first space is after date and we only need date, set var OLDFile with date and current folder 
    for /f %%z in (listTemp2.txt) do set OLDFile=%%z %%x 

    ::append list.txt with OLDFile 
    call echo %%OLDFile%% >> list.txt 
) 
if exist listTemp1.txt (del listTemp1.txt) 
if exist listTemp2.txt (del listTemp2.txt) 

выше сценарий дал мне точный результат я хотел, который был <date of oldest file within folder> <folder>

2014/02/20 C:\TEMP\folder 1 
2014/02/19 C:\TEMP\folder 2 
2014/02/19 C:\TEMP\folder 1\folder 2 

Я создал временные файлы .txt в виду того что я не мог труба результатов цикла (возможно?)

в любом случае, еще раз спасибо @Mark, не мог понять, как это сделать без вашей помощи, и, самое главное, пролом, который помог мне понять код!

3

Вы на правильном пути. Встроенная команда dir, как вы нашли, может выполнить вашу сортировку для вас. Если вы только заботитесь о дате самого старого файла, разрешите сортировать по дате, изменив (по убыванию) и получить последнюю запись в списке. Это должно делать то, что вам нужно, я думаю:

for /f %%x in ('dir /b /o-d /a-d') do set OLDESTFILE=%%~fx last modified at %%~tx 
echo %OLDESTFILE% 

Позвольте мне сломать это.

переключается на команду dir даст вам список файлов только (/a-d), в «короткой» форме (/b - только список файлов, а не типичный полный dir выход), и сортирует, что список по дате, по убыванию (/o-d).

for цикла, который обтекает, что итерация по каждому из этих файлов и устанавливает переменное окружение с текстом в формате:

C:\TEMP\WindowsXP-KB913580-x86-END.exe last modified at 2006/05/25 12:12 PM

Вы можете прочитать for /? для всех шершавых подробной информации по другие ~ модификаторы, которые вы можете использовать.

Если вы запустите это с помощью echo on, вы увидите, что он на самом деле устанавливает эту переменную среды каждый раз через цикл, переписывая ее с каждой последующей итерацией. Однако это нас устраивает, так как мы действительно хотим, чтобы последняя запись была в любом случае.

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

for /f %%x in ('dir /b /o-d /a-d') do (
    for /f "tokens=1" %%a in ("%%~tx") do (
     set OLDESTFILE=%%~fx last modified on %%a 
    ) 
) 
echo %OLDESTFILE% 

Внутренний for контура принимает здесь дату и время (например, 2006/05/24 12:12) в виде списка аргументов. Поскольку cmd использует пробелы как разделители по умолчанию, это дает вам два токена, 2006/05/24 и 12:12. Указав tokens=1, вы явно указываете for, что вам будет только заботиться о первом из них: дата *.

Надеюсь, это поможет вам двигаться по правильному пути.Теперь, когда у вас есть сложная часть, вы можете обернуть все это в цикле, который получает вам список каталогов, которые вы заботитесь, чтобы запустить это.


* Педантично говоря, вы на самом деле не нужны tokens=1 там, так как %%a будет ссылаться только на первый токен, и время будет в %%b, но я подумал, что это будет полезно для иллюстративных целей.

Смежные вопросы