Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Loop (files & folders)", в содержании - "File, Directory and Disk Management" - "Loop (files & folders)", v1.0.46.14.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

Loop (файлы и папки)

Возвращает указанные файлы или папки по одному/одной.

Loop, FilePattern [, IncludeFolders?, Recurse?]

Параметры

FilePattern Имя файла или папки, либо шаблон, такой как C:\Temp\*.tmp. Если не задан полный путь, FilePattern ищется в папке, указанной в переменной A_WorkingDir.

В шаблоне поддерживаются как звёздочка, так и вопросительный знак. Может указываться как длинное/нормальное имя файла, так и короткое имя в формате 8.3.

Если указан одиночный файл или папка (не шаблон) и параметр Recurse задан как 1, будет найдено несколько совпадений, если файл с таким именем встречается более чем в одной папке.
IncludeFolders? Включать ли в просмотр папки. Одна из следующих цифр (или пустой, чтобы использовалось значение по умолчанию):

0 (по умолчанию): папки не возвращаются (только файлы).
1: возвращаются все файлы и папки, которые отвечают шаблону.
2: возвращаются только папки (не файлы).
Recurse? Рекурсия. Одна из следующих цифр (или пустой, чтобы использовалось значение по умолчанию):

0 (по умолчанию): рекурсия в подпапки не производится.

1: рекурсия в подпапки производится и возвращаются все папки и файлы в них, совпадающие с FilePattern. Рекурсия производится во все подпапки, не только в те, чьи имена совпадают с FilePattern.

Специальные переменные, доступные для использования внутри файлового цикла

Следующие переменные существуют внутри любого файлового цикла. Если один файловый цикл находится внутри другого, файл внутреннего цикла будет иметь преимущество.


A_LoopFileName Имя текущего файла или папки (без пути).
A_LoopFileExt Расширение файла (например, TXT, DOC, или EXE). Точка (.) не включается.
A_LoopFileFullPath Полный путь и имя текущего файла/папки. Однако, если FilePattern содержит не полный, а относительный путь, то путь здесь также будет относительным. Вдобавок, все короткие (8.3) имена папок в FilePattern останутся короткими (длинный вариант см. в следующем пункте).
A_LoopFileLongPath Отличается от A_LoopFileFullPath тем, что: 1) всегда содержит полный/абсолютный путь файла, даже если FilePattern содержит относительный путь; 2) все короткие (8.3) имена папок в FilePattern конвертируются в длинные; 3) буквы в FilePattern переводятся в верхний либо нижний регистр, чтобы имена приняли тот вид, в котором они хранятся в файловой системе. Это полезно для приведения имён файлов - таких как те, что передаются в скрипт как параметры командной строки - точно к тому виду, в каком они показываются в Проводнике.
A_LoopFileShortPath Короткое имя в формате 8.3 для текущего файла/папки. Например, C:\MYDOCU~1\ADDRES~1.txt. Однако, если FilePattern содержит не абсолютный, а относительный путь, то путь здесь тоже будет относительным.

Чтобы получить полный путь и имя в формате 8.3 для одиночного файла или папки, задайте его/её имя в FilePattern как в этом примере:
Loop, C:\My Documents\Address List.txt
    ShortPathName = %A_LoopFileShortPath%
Замечание: эта переменная будет пустой, если файл не имеет короткого имени, что может случиться в системе, где реестр содержит параметр NtfsDisable8dot3NameCreation. Она также будет пустой, если FilePattern содержит относительный путь, а в теле цикла происходит переключение в другую рабочую папку командой SetWorkingDir.
A_LoopFileShortName Короткое имя файла в формате 8.3. Если файл не имеет такого имени (в силу того, что длинное имя короче, чем 8.3 или, возможно, потому, что создание коротких имён отключено в файловой системе NTFS), взамен будет возвращено значение для A_LoopFileName.
A_LoopFileDir Полный путь каталога, в котором находится A_LoopFileName. Однако, если FilePattern содержит не абсолютный, а относительный путь, то и здесь путь также будет относительным. Путь к корневому каталогу не будет иметь обратной косой черты на конце. Например: С:
A_LoopFileTimeModified Время последнего изменения файла. Формат YYYYMMDDHH24MISS. (Прим. переводчика: см. расшифровку этого формата в описании FileGetTime).
A_LoopFileTimeCreated Время создания файла. Формат YYYYMMDDHH24MISS.
A_LoopFileTimeAccessed Время последнего доступа к файлу. Формат YYYYMMDDHH24MISS.
A_LoopFileAttrib Атрибуты текущего файла. (Прим. переводчика: подробнее см. в описании FileGetAttrib).
A_LoopFileSize Размер текущего файла в байтах. Файлы больше 4 Гб также поддерживаются.
A_LoopFileSizeKB Размер текущего файла в килобайтах, округлённый до ближайшего снизу целого числа.
A_LoopFileSizeMB Размер текущего файла в мегабайтах, округлённый до ближайшего снизу целого числа.

Примечания

Файловый цикл полезен для обработки множества файлов и/или папок по очереди.

Возвращаются все совпадающие файлы, включая скрытые. Напротив, средства операционной системы, такие как команда DIR, по умолчанию пропускают скрытые файлы. Чтобы избежать обработки скрытых, системных и/или разрешённых только для чтения файлов, используйте в файловом цикле что-нибудь вроде следующего:

if A_LoopFileAttrib contains H,R,S ; Пропускать файл, если он H (скрытый), R (только для чтения) или S (системный).
                                   ; Замечание: в строке "H,R,S" не должно быть пробелов.
    continue ; Пропустить этот файл и перейти к следующему.

Чтобы получать относительные пути файлов вместо абсолютных во время рекурсивного поиска, перед выполнением цикла сделайте нужную базовую папку рабочей с помощью команды SetWorkingDir и не указывайте путь в команде Loop (например, Loop, *.*, 0, 1). Это заставит A_LoopFileFullPath возвращать пути, относительные к базовой папке.

Работа файлового цикла может нарушиться, если он создаёт или переименовывает файлы или папки внутри своей собственной области поиска. Например, если он переименовывает файлы посредством FileMove или другим способом, это может привести к тому, что каждый такой файл будет найден дважды: один раз под своим старым именем и другой раз под новым. Чтобы обойти это, переименовывайте файлы только после составления их списка. Например:

FileList =
Loop *.jpg
    FileList = %FileList%%A_LoopFileName%`n
Loop, parse, FileList, `n
    FileMove, %A_LoopField%, renamed_%A_LoopField%

В файловой системе NTFS файлы, вероятно, всегда возвращаются в алфавитном порядке. В других файловых системах какого-то определённого порядка при этом нет. Для упорядочивания используйте команду Sort, как показано в разделе примеров ниже.

Файлы и папки, чей полный путь длиннее 259 символов, игнорируются, как если бы они не существовали. Такие файлы - редкость, поскольку операционная система, в норме, не позволяет их создавать.

Смотрите в описании команды Loop информацию о блоках кода, командах Break, Continue и переменной A_Index (которая существует в циклах всех типов).

Примеры

; Пример №1
Loop, %A_ProgramFiles%\*.txt, , 1 ; Рекурсия в подпапки.
{
    MsgBox, 4, , Имя файла = %A_LoopFileFullPath%`n`nПродолжить?
    IfMsgBox, No
        break
} 

; Пример №2: вычисляет размер папки, включая файлы во всех её подпапках.
SetBatchLines, -1 ; Выполнять на максимальной скорости.
FolderSizeKB = 0
FileSelectFolder, WhichFolder ; Запрос пользователю на выбор папки.
Loop, %WhichFolder%\*.*, , 1
    FolderSizeKB += %A_LoopFileSizeKB%
MsgBox Размер %WhichFolder% -- %FolderSizeKB% Кб. 

; Пример №3: возвращает файлы, отсортированные по имени (сортировку по дате см. в следующем примере).
FileList = ; Очистить переменную.
Loop, C:\*.*
    FileList = %FileList%%A_LoopFileName%`n
Sort, FileList, R ; Опция R означает сортировку в обратном порядке. Другие опции см. в описании Sort.
Loop, parse, FileList, `n
{
    if A_LoopField = ; Игнорировать пустую строку в конце списка.
        continue
    MsgBox, 4,, Файл номер %A_Index%: %A_LoopField%.  Продолжить?
    IfMsgBox, No
        break
} 

; Пример №4: возвращает имена файлов, отсортированных по дате изменения.
FileList =
Loop, %A_MyDocuments%\Photos\*.*, 1
    FileList = %FileList%%A_LoopFileTimeModified%`t%A_LoopFileName%`n
Sort, FileList ; Сортировать по дате.
Loop, parse, FileList, `n
{
    if A_LoopField = ; Пропустить последний перевод строки (пустую строку) в конце списка.
        continue
    StringSplit, FileItem, A_LoopField, %A_Tab% ; Разбить на две части в месте, где табуляция.
    MsgBox, 4,, Следующий файл (изменён %FileItem1%):`n%FileItem2%`n`nПродолжить?
    IfMsgBox, No
        break
}

; Пример №5: копирует только те файлы, которые новее,
; чем одноимённые им файлы в месте назначения.
CopyIfNewer:
; Переменные CopySourcePattern и CopyDest были заданы в коде, вызвавшем эту подпрограмму.
Loop, %CopySourcePattern%
{
    copy_it = n
    IfNotExist, %CopyDest%\%A_LoopFileName% ; Всегда копировать, если одноимённый файл не существует.
        copy_it = y
    else
    {
        FileGetTime, time, %CopyDest%\%A_LoopFileName%
        EnvSub, time, %A_LoopFileTimeModified%, seconds ; Вычесть время файла-источника из времени файла-приёмника.
        if time < 0 ; Файл-источник новее, чем файл-приёмник.
            copy_it = y
    }
    if copy_it = y
    {
        FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1 ; Перезапись при копировании разрешена.
        if ErrorLevel
            MsgBox, Не удалось скопировать "%A_LoopFileFullPath%" в "%CopyDest%\%A_LoopFileName%".
    }
}
Return 

; Пример №6: конвертирует имена файлов, переданные скрипту как параметры командной строки.
; Возвращает длинные имена, полные пути и правильный регистр букв (как в файловой системе).
Loop %0% ; Для каждого файла, брошенного на значок скрипта (или переданного как параметр).
{
    GivenPath := %A_Index% ; Следующий параметр командной строки.
    Loop %GivenPath%
        LongPath = %A_LoopFileLongPath%
    MsgBox Длинное имя и путь в правильном регистре для файла`n%GivenPath%`n`n%LongPath%
}

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.