Loop (파일 & 폴더)

지정된 파일이나 폴더를 한 번에 하나씩 열람합니다.

New Syntax [v1.1.21+]

Loop, Files, FilePattern , Mode

매개변수

Files

문자 그대로 Files (대소문자-구별). 변수나 표현식 불가능.

FilePattern

단일 파일이나 폴더의 이름, 또는C:\Temp\*.tmp와 같은 와이들카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 A_WorkingDir에 있다고 간주됩니다.

별표와 물음표 표식 모두 와일드카드로 지원됩니다. 패턴이 파일의 긴/보통 이름에 또는 그의 8.3 짧은 이름에 나타나면 일치가 일어납니다.

If this parameter is a single file or folder (i.e. no wildcards) and Mode includes R, more than one match will be found if the specified file name appears in more than one of the folders being searched.

Patterns longer than 259 characters may fail to find any files due to system limitations (MAX_PATH). This limit can be bypassed by using the \\?\ long path prefix, with some stipulations.

Mode

If blank or omitted, only files are included and subdirectories are not recursed into. Otherwise, specify one or more of the following letters:

Old Syntax

비추천: 이 구문는 새 스크립트에 사용을 추천하지 않습니다. Use the new syntax instead.

Loop, FilePattern , IncludeFolders?, Recurse?

매개변수

FilePattern

단일 파일이나 폴더의 이름, 또는C:\Temp\*.tmp와 같은 와이들카드 패턴. FilePattern은 절대 경로를 지정하지 않으면 %A_WorkingDir%에 있다고 간주됩니다.

별표와 물음표 표식 모두 와일드카드로 지원됩니다. 패턴이 파일의 긴/보통 이름에 또는 그의 8.3 짧은 이름에 나타나면 일치가 일어납니다.

If this parameter is a single file or folder (i.e. no wildcards) and Recurse is set to 1, more than one match will be found if the specified file name appears in more than one of the folders being searched.

IncludeFolders?

If blank or omitted, it defaults to 0 (only files are retrieved). 그렇지 않으면, 다음 숫자 중 하나를 지정하십시오:

Recurse?

비어 있거나 생략하면, 기본값은 0 (하위폴더에 재귀해 들어가지 않습니다)입니다. 그렇지 않으면, 다음 숫자 중 하나를 지정하십시오:

파일-회돌이 안에서 사용할 수 있는 특별한 변수

다음 변수들은 파일-회돌이라면 모두 존재합니다. 안쪽 파일-회돌이가 바깥 파일-회돌이에 둘러 싸여 있다면, 안쪽 파일 회돌이가 우선권이 있습니다:

변수 설명
A_LoopFileName 현재 열람된 파일이나 폴더의 이름 (경로 없음).
A_LoopFileExt 파일 확장자 (예, TXT, DOC, 또는 EXE). 마침표 (.)는 포함되지 않습니다.
A_LoopFileFullPath
A_LoopFilePath

현재 열람된 파일/폴더의 전체 경로와 이름. FilePattern에 절대 경로가 아니라 상대 경로가 담겨 있다면, 여기에도 상대 경로가 담깁니다. 게다가, FilePattern이 짧은 (8.3) 폴더 이름이면 역시 짧은 이름이 담깁니다 (긴 버전을 얻으려면 다음 항목을 참조하십시오).

A_LoopFilePath is available in [v1.1.28+] as an alias of A_LoopFileFullPath, which is a misnomer.

A_LoopFileLongPath

다음과 같은 점에서 A_LoopFileFullPath와 다릅니다: 1) 언제나 파일의 절대/완전한 경로가 담깁니다. FilePattern에 절대 경로가 담겨 있어도 상관이 없습니다; 2) FilePattern 자체의 짧은 (8.3) 폴더 이름은 긴 이름으로 변환됩니다; 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에 절대 경로가 아니라 상대 경로가 들어 있다면, 여기의 경로도 상대 경로가 됩니다. 루트 디렉토리는 뒤에 역사선을 포함하지 않습니다. 예를 들어: C:
A_LoopFileTimeModified 파일이 마지막으로 수정된 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileTimeCreated 파일이 생성된 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileTimeAccessed 파일에 마지막으로 접근한 시각. 형식은 YYYYMMDDHH24MISS.
A_LoopFileAttrib 현재 열람된 파일의 속성.
A_LoopFileSize 현재 열람된 파일의 바이트 단위 크기. 4 기가 바이트보다 큰 파일도 지원합니다.
A_LoopFileSizeKB 현재 열람된 파일의 Kbytes 단위 크기, 가장 가까운 정수로 반내림됩니다.
A_LoopFileSizeMB 현재 열람된 파일의 Mbytes 단위 크기, 가장 가까운 정수로 반내림 됩니다.

논평

파일 회돌이는 파일/폴더의 집단을 한 번에 하나씩 처리하고 싶을 때 유용합니다.

숨은 파일을 포함하여, 부합하는 모든 파일이 열람됩니다. 대조적으로, DIR와 같은 OS 특징은 기본으로 숨은 파일을 제외합니다. 숨은, 시스템, 또는 읽기 전용 파일을 처리하지 않도록 하려면, 회돌이 안에 다음과 같은 코드를 사용하십시오:

if A_LoopFileAttrib contains H,R,S  ; 속성이 H (Hidden), R (Read-only), 또는 S (System)인 파일은 건너 뜁니다. 주의: "H,R,S"에 스페이스가 없습니다.
    continue  ; 이 파일을 건너 뛰고 다음 파일로 갑니다.

파일을 재귀적으로 검색하는 동안 절대 경로 대신에 상대 경로를 얻으려면, SetWorkingDir을 사용하여 회돌이를 시작하기 전에 먼저 기본 폴더로 변경한 다음, Loop에서는 그 경로를 생략하십시오 (예, Loop, *.*, 0, 1). 그러면 A_LoopFileFullPath에 그 기본 폴더에 상대적인 파일의 경로가 담깁니다.

파일-회돌이는 자신의 범위 안에서 파일이나 폴더를 만들거나 이름을 바꿀 경우 스스로를 혼란에 빠트릴 수 있습니다. 예를 들어, FileMove나 기타 수단으로 파일 이름을 변경한다면, 그런 파일은 각각 두 번 발견이 될 수 있습니다: 한 번은 그의 예전 이름으로 그리고 다시 새 이름으로 발견됩니다. 이를 우회하려면, 파일 리스트가 생성된 후에만 파일의 이름을 바꾸십시오. 예를 들어:

FileList := ""
Loop, Files, *.jpg
    FileList .= A_LoopFileName "`n"
Loop, Parse, FileList, `n
    FileMove, %A_LoopField%, renamed_%A_LoopField%

NTFS 파일 시스템의 파일은 아마도 언제나 알파벳 순서로 열람될 것입니다. 다른 파일 시스템에서는 특별한 순사가 없이 열람됩니다. 특정 순서로 열람하려면, 아래 섹션의 에제에서 보여주는 것처럼 Sort 명령어를 사용하십시오.

File patterns longer than 259 characters are supported only by Unicode versions of AutoHotkey [v1.1.31+], and only when at least one of the following is true:

In all other cases, file patterns longer than 259 characters will not find any files or folders. This limit applies both to FilePattern and any temporary pattern used during recursion into a subfolder. However, the combined length of each file's directory and filename can exceed 259 characters in [v1.1.31+]; on earlier versions such files are skipped over as though they do not exist.

Blocks, Break, Continue, 그리고 A_Index 변수 (모든 유형의 회돌이에 존재함)에 관한 정보는 Loop를 참조하십시오.

Loop, Break, Continue, 블록, SplitPath, FileSetAttrib, FileSetTime

예제

Reports the full path of each text file located in a directory and in its subdirectories.

Loop Files, %A_ProgramFiles%\*.txt, R  ; 서브폴더 안으로 재귀합니다.
{
    MsgBox, 4, , Filename = %A_LoopFileFullPath%`n`nContinue?
    IfMsgBox, No
        break
}

폴더의 크기를 계산합니다. 그의 서브폴더 안에 있는 파일들을 모두 포함합니다.

SetBatchLines, -1  ; 연산을 최대 속도로 설정합니다.
FolderSizeKB := 0
FileSelectFolder, WhichFolder  ; 사용자에게 폴더를 고르도록 요청합니다.
Loop, Files, %WhichFolder%\*.*, R
    FolderSizeKB += A_LoopFileSizeKB
MsgBox Size of %WhichFolder% is %FolderSizeKB% KB.

이름으로 정렬된 파일 이름들을 열람합니다. (다음 예제는 날짜로 정렬).

FileList := ""  ; 빈 값으로 초기화합니다.
Loop, C:\*.*
    FileList .= A_LoopFileName "`n"
Sort, FileList, R  ; R 옵션은 역순으로 정렬합니다. 다른 옵션은 Sort를 참조하십시오.
Loop, parse, FileList, `n
{
    if (A_LoopField = "")  ; 리스트 맨 끝에 있는 빈 항목은 무시합니다.
        continue
    MsgBox, 4,, File number %A_Index% is %A_LoopField%.  계속할까요?
    IfMsgBox, No
        break
}

수정 날짜로 정렬된 파일 이름들을 열람합니다.

FileList := ""
Loop, Files, %A_MyDocuments%\Photos\*.*, FD  ; 파일과 디렉토리를 포함합니다
    FileList .= A_LoopFileTimeModified "`t" A_LoopFileName "`n"
Sort, FileList  ; Sort by date.
Loop, Parse, FileList, `n
{
    if (A_LoopField = "")  ; 리스트 맨 끝의 마지막 라인피드 (빈 항목)은 무시합니다.
        continue
    StringSplit, FileItem, A_LoopField, %A_Tab%  ; 탭 문자에서 두 부분으로 나눕니다.
    MsgBox, 4,, The next file (modified at %FileItem1%) is:`n%FileItem2%`n`nContinue?
    IfMsgBox, No
        break
}

목표 파일과 비교해서 더 새로운 소스 파일만 복사합니다.

CopyIfNewer:
; 호출자는 변수 CopySourcePattern과 CopyDest를 우리 대신 설정해 줍니다.
Loop, Files, %CopySourcePattern%
{
    copy_it := false
    if not FileExist(CopyDest "\" A_LoopFileName)  ; 목표 파일이 아직 존재하지 않으면 항상 복사합니다.
        copy_it := true
    else
    {
        FileGetTime, time, %CopyDest%\%A_LoopFileName%
        EnvSub, time, %A_LoopFileTimeModified%, seconds  ; 목표 파일의 시간으로부터 소스 파일의 시간을 뺍니다.
        if (time < 0)  ; 소스 파일은 목표 파일보다 더 새롭습니다.
            copy_it := true
    }
    if copy_it
    {
        FileCopy, %A_LoopFileFullPath%, %CopyDest%\%A_LoopFileName%, 1   ;  overwrite=yes를 사용하여 복사합니다
        if ErrorLevel
            MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%".
    }
}
Return

명령줄 매개변수를 통하여 건네어진 파일 이름을 긴 이름, 완전한 이름으로 변환합니다. 그리고 파일 시스템에 저장된 대소문자에 맞게 이름을 대문자나 소문자로 교정합니다.

Loop %0%  ; 스크립트에 떨구어진 각 파일에 대하여 (또는 매개변수로 건네어진).
{
    GivenPath := %A_Index%  ; 다음 명령줄 매개변수를 열람합니다.
    Loop %GivenPath%, 1
        LongPath := A_LoopFileLongPath
    MsgBox 대소문자를 교정한 기다란 경로의 파일이름은`n%GivenPath%`n다음과 같습니다:`n%LongPath%
}