PDA

Показать полную графическую версию : Прошу прокомментировать данный код


Чин Хон
27-02-2011, 14:53
Код:
@echo off

SETLOCAL EnableDelayedExpansion
for /f "delims==" %%a in ('ftype^|find /i "\notepad.exe"') do set "$f=!$f! /c:"=%%a""
for /f "delims==" %%a in ('assoc^|findstr/ie%$f%') do set "$x=!$x! %systemdrive%\*%%a"

SETLOCAL DisableDelayedExpansion
(for /f "delims=" %%a in ('dir /b/s/a-d %$x% 2^>nul') do (
for /f "tokens=1,2" %%b in ('dir/a/tc "%%a"^|findstr/iec:"%%~nxa"') do echo %%b %%c %%a
))>"%~dpn0.log"

SendMessage
28-02-2011, 08:02
По хорошему, amel27 должен отвечать - его код. Но рискну. :)

ftype^|find /i "\notepad.exe"
Команда ftype выводит типы файлов и связанные с ними приложения. Например: inifile=%SystemRoot%\System32\NOTEPAD.EXE %1
Следующей командой - find /i "\notepad.exe" отбираются только те из них, что связаны с Блокнотом.
set "$f=!$f! /c:"=%%a""
Создается, скажем так, массив значений для использования в будущей команде findstr/ie%$f%. Выглядит, в конечном итоге, он примерно так: /c:"=inffile" /c:"=inifile" /c:"=Text" и т. д. То есть из всех типов файлов, связанных с Блокнотом.
assoc^|findstr/ie%$f%
Команда assoc выводит связанные с типами файлов расширения. Например: .txt=Text
findstr/ie%$f% отбирает только те расширения, что относятся к типам файлов, которые переданы в переменную %$f%. Смотрится примерно так: findstr/ie /c:"=inffile" /c:"=inifile" /c:"=Text"
set "$x=!$x! %systemdrive%\*%%a"
Снова создается массив значений, теперь уже для команды dir /b/s/a-d %$x% 2^>nul. Он состоит из масок для вывода файлов. Примерно такой: %systemdrive%\*.ini %systemdrive%\*.inf %systemdrive%\*.txt. Где %systemdrive% - системный диск.
dir /b/s/a-d %$x% 2^>nul
Выводятся все файлы на диске, соответствующие маскам (dir /b/s/a-d %systemdrive%\*.ini %systemdrive%\*.inf %systemdrive%\*.txt). 2^>nul - игнорировать ошибки.
dir/a/tc "%%a"^|findstr/iec:"%%~nxa"
Получение времени создания файла. %%a - полученное имя файла из вышестоящего цикла. findstr/iec:"%%~nxa" - ищется строка с именем файла, поскольку командой dir/a/tc выводится несколько строк, а нужна именно строка с именем файла. tokens=1,2 - из этой строки отбираются только 1 и 2 элементы, разделенные пробелами (табуляцией). В переменную %%b помещается дата создания файла, в переменную %%c - время.
Остальное все, я думаю, не представляет сложности для понимания.

Чин Хон
28-02-2011, 15:06
Спасибо!
А "SETLOCAL EnableDelayedExpansion" что?

Nun-Nun
28-02-2011, 17:09
Чин Хон,

Инфа из интернета:
В обычном случае, чтобы узнать значение переменной окружения, надо воспользоваться конструкцией %переменная%. Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы батника, нужно использовать команду setlocal enabledelayedexpansion и вместо символа "%", использовать символ "!". Иначе, значение переменной в цикле будет всегда одним и тем же - таким, каким было до входа в цикл.

Чин Хон
28-02-2011, 21:11
Ясно, спасибо!




© OSzone.net 2001-2012