Loop (files & folders)
지정된 파일이나 폴더를 , 한 번에 하나씩 열람합니다.
Loop, Files, FilePattern [, Mode] ; v1.1.21+ (권장)
Loop, FilePattern [, IncludeFolders?, Recurse?]
매개변수
- Files [v1.1.21+]
문자 그대로
Files
(대소문자-구별). 변수나 표현식 불가능.- FilePattern
파일이나 폴더의 이름, 또는
C:\Temp\*.tmp
와 같은 와일드카드 패턴. FilePattern은 절대 경로가 지정되어 있지 않으면 %A_WorkingDir%에 있다고 간주됩니다.별표와 물음표 표식 모두 와일드카드로 지원됩니다. 패턴이 파일의 긴/보통 이름에 또는 그의 8.3 짧은 이름에 나타나면 일치가 일어납니다.
이 매개변수가 단일 파일이나 폴더이고 (즉, 와일드카드가 아니고) Recurse가 1로 설정되었거나 Mode에
R
이 포함되어 있으면, 부합하는 것이 여럿일 수 있습니다. 지정된 파일 이름이 검색되는 여러 폴더에 나타나기 때문입니다.- Mode [v1.1.21+]
다음 기호들로 구성됩니다:
D
: 디렉토리 포함 (폴더).
F
: 파일 포함. F와 D를 모두 생략하면 파일도 포함됩니다.
R
: 서브디렉토리 안으로 재귀합니다 (서브폴더). R이 생략되면, 서브디렉토리의 파일과 폴더 포함되지 않습니다.- IncludeFolders?
다음 숫자 중 하나, 또는 비어 있으면 기본값 사용:
0 (기본값) 폴더는 열람하지 않습니다 (파일만 열람).
1 와일드카드 패턴에 부합하는 모든 파일과 폴더를 열람합니다.
2 폴더만 열람합니다 (파일 열람 안함).- Recurse?
- 다음 숫자 중 하나, 또는 비어 있으면 기본값을 사용합니다:
0 (기본값) 서브폴더 안으로 재귀하지 않습니다.
1 서브폴더 안으로 재귀해 들어가 거기에서 FilePattern에 부합하는 모든 파일과 폴더를 열람합니다. 이름이 FilePattern에 부합하지 않아도 모든 서브폴더를 재귀해 들어갑니다.
파일-회돌이 안에서 사용할 수 있는 특별한 변수
다음 변수들은 파일-회돌이라면 모두 존재합니다. 안쪽 파일-회돌이가 바깥 파일-회돌이에 둘러 싸여 있다면, 안쪽 파일 회돌이가 우선권이 있습니다:
A_LoopFileName | 현재 열람된 파일이나 폴더의 이름 (경로 없음). |
A_LoopFileExt | 파일 확장자 (예, TXT, DOC, 또는 EXE). 마침표 (.)는 포함되지 않습니다. |
A_LoopFileFullPath | 현재 열람된 파일/폴더의 전체 경로와 이름. FilePattern에 절대 경로가 아니라 상대 경로가 담겨 있다면, 여기에도 상대 경로가 담깁니다. 게다가, FilePattern이 짧은 (8.3) 폴더 이름이면 역시 짧은 이름이 담깁니다 (긴 버전을 얻으려면 다음 항목을 참조하십시오). |
A_LoopFileLongPath | 다음과 같은 점에서 A_LoopFileFullPath와 다릅니다:
|
A_LoopFileShortPath | 현재 열람된 파일/폴더의 8.3 짧은 경로와 이름. 예를 들어: 단일 파일이나 폴더에 대하여 완벽한 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 = %FileList%%A_LoopFileName%`n Loop, Parse, FileList, `n FileMove, %A_LoopField%, renamed_%A_LoopField%
NTFS 파일 시스템의 파일은 아마도 언제나 알파벳 순서로 열람될 것입니다. 다른 파일 시스템에서는 특별한 순사가 없이 열람됩니다. 특정 순서로 열람하려면, 아래 섹션의 에제에서 보여주는 것처럼 Sort 명령어를 사용하십시오.
파일이나 폴더 이름이 259 문자가 넘어가면 마치 존재하지 않는 것처럼 건너 뜁니다. 그런 파일은 거의 없습니다. 보통 운영 체제에서 그런 파일은 생성을 허용하지 않기 때문입니다.
Blocks, Break, Continue, 그리고 A_Index 변수 (모든 유형의 회돌이에 존재함)에 관한 정보는 Loop를 참조하십시오.
관련 항목
Loop, Break, Continue, Blocks, SplitPath, FileSetAttrib, FileSetTime
예제
; 예제 #1: Loop Files, %A_ProgramFiles%\*.txt, R ; 서브폴더 안으로 재귀합니다. { MsgBox, 4, , Filename = %A_LoopFileFullPath%`n`nContinue? IfMsgBox, No break }
; 예제 #2: 폴더의 크기를 계산합니다. 그의 서브폴더 안에 있는 파일들을 모두 포함합니다: SetBatchLines, -1 ; 최대 속도로 연산을 실행합니다. FolderSizeKB = 0 FileSelectFolder, WhichFolder ; 사용자에게 폴더를 고르도록 요구합니다. Loop, Files, %WhichFolder%\*.*, R FolderSizeKB += %A_LoopFileSizeKB% MsgBox Size of %WhichFolder% is %FolderSizeKB% KB.
; 예제 #3: 이름으로 정렬된 파일 이름들을 열람합니다. (다음 예제는 날짜로 정렬): FileList = ; 빈 값으로 초기화합니다. Loop, C:\*.* FileList = %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%. Continue? IfMsgBox, No break }
; 예제 #4: 수정 날짜로 정렬된 파일 이름들을 열람합니다: FileList = Loop, Files, %A_MyDocuments%\Photos\*.*, FD ; 파일과 디렉토리를 포함합니다 FileList = %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 }
; 예제 #5: 목표 파일과 비교해서 더 새로운 소스 파일만 복사합니다: CopyIfNewer: ; 호출자는 변수 CopySourcePattern과 CopyDest를 우리 대신 설정해 줍니다. Loop, Files, %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 ; overwrite=yes를 사용하여 복사합니다 if ErrorLevel MsgBox, Could not copy "%A_LoopFileFullPath%" to "%CopyDest%\%A_LoopFileName%". } } Return
; 예제 #6: 명령줄 매개변수를 통하여 건네어진 파일 이름을 긴 이름, 완전한 이름으로 변환합니다. ; 그리고 파일 시스템에 저장된 대소문자에 맞게 이름을 대문자나 소문자로 교정합니다. Loop %0% ; 스크립트에 떨구어진 각 파일에 대하여 (또는 매개변수로 건네어진). { GivenPath := %A_Index% ; 다음 명령줄 매개변수를 열람합니다. Loop %GivenPath%, 1 LongPath = %A_LoopFileLongPath% MsgBox The case-corrected long path name of file`n%GivenPath%`nis:`n%LongPath% }