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

Чин Хон 27-02-2011 14:53 1622984

[решено] Прошу прокомментировать данный код
 
Код:
@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 1623421

По хорошему, 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 1623720

Спасибо!
А "SETLOCAL EnableDelayedExpansion" что?

Nun-Nun 28-02-2011 17:09 1623804

Чин Хон,

Инфа из интернета:
Цитата:

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

Чин Хон 28-02-2011 21:11 1624001

Ясно, спасибо!


Время: 17:33.

Время: 17:33.
© OSzone.net 2001-