대안 # 1 : FOR / R은 나에게 # 2보다 직관적입니다.
대안 # 2 : FOR / F는 BrianAdkins의 제안에서 "이름의 공백"문제를 해결합니다.
대안 # 3 : 경로가 큰 따옴표로 묶인 것을 제외하고 FORFILES가 제 선택입니다.
브라이언이나 다른 전문가들은 더 우아한 솔루션을 가지고 있거나 12 가지 다른 솔루션을 제안 할 수 있지만이 3 가지 작업은 가능합니다. FOR TOKENS를 사용해 보았지만 머리글과 바닥 글을 제거해야 # 1로 되돌아갔습니다. 또한 작은 .bat 파일을 만들고 호출하는 것을 고려했지만 다른 파일이 추가되었습니다 (함수와 마찬가지로 더 큰 유연성을 제공하지만).
공백이있는 디렉토리 및 파일 이름, 200 + 문자 파일 이름, 확장명이없는 파일 이름 및 작은 드라이브의 루트 (시간은 조금만-Brian이 제안한 것처럼 약간 느리게)로 모든 대안을 테스트했지만 Windows 탐색기에서 검색 중이므로 모든 검색 앱을 설치 한 것입니다).
대안 # 1 : FOR / R
Best (?) Brian의 솔루션이 왜 효과가 없는지 알아 내려고 노력하면서 HELP FOR를 살펴보고 / R 접근법을 시도하기로 결정했습니다. (파일 생성은 대안 # 2와 동일합니다.)
@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA
예-작동 (재귀를 보여주기 위해 위와 다른 디렉토리)
@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
대안 # 2 : FOR / F
BrianAdkins의 제안 : @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
수정 대답 입니다 :
@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA
더 완전한 파일로 억제 디렉토리와 출력 (추가)와 대답은 :
@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt
참고 : "delims = *"는 파일 이름에 허용되지 않는 문자를 지정합니다.
참고 : 두 번째 명령은 / a : -d를 통해 디렉토리를 표시하지 않습니다.
참고 : 다른 변수 이름을 선택할 경우 변수와 변수 매개 변수의 구분을 명확히하기 위해 FOR 변수 이름을 대문자로 만들었습니다.
참고 : OP가 파일에 대한 출력을 요청함에 따라 grins만을 위해 파일에 추가되었습니다.
ECHO의 상태를 실제로 확인하고 재설정해야한다고 가정합니다.
문제-이름의 공백
Brian의 제안 된 솔루션은 공백이 포함 된 파일 및 폴더 이름을 처리하지 않습니다 (적어도 Vista 구성에는 해당되지 않음).
예-잘못됨
(delims 없음; OP 당 디렉토리를 억제하지만 강조하기 위해 파일 이름 앞뒤에 크기가 모두 포함됨)
잘린 이름 및 크기 (6 개 중 4 개 파일이 잘못됨) :
@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder
C:\DeleteLater\Folder
C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
예-수정
(파일에 추가되지 않고 화면에 출력되는 메모)
@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032
대안 # 3 : FORFILES (견적 문제)
이 솔루션은 FORFILES 문서 ( forfiles /?
) 의 마지막 두 예제와 똑같습니다 .
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
이 예제들을 결합하고 파일에 쓰면 답이 (거의) 생깁니다.
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt
경로는 출력에서 따옴표로 묶여 있습니다. 또는 전환
여부는 중요하지 않습니다 .
각 디렉토리를 구분하는 빈 줄을 추가하면 IF의 간단한 확장이 될 것입니다.echo on
echo off
주의 : 마스크/m *.*
를사용하면확장자가없는 파일 (예 : 마지막 파일)이 반환되지 않습니다!
Aside :
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
OP는 원하는 것이 아니라 때로는 편리한디렉토리의 내용으로 각 디렉토리에 파일을 씁니다.
예-작동합니다 (따옴표로 전체 경로가 있음)
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize"
"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0
이 예에는 파일 이름이 매우 긴 추가 디렉토리와 확장자가없는 파일 이름이 포함됩니다.
문제 : 견적의 경로
따라서 OP 예제 당 원하지 않는 따옴표를 제거하고 대안 # 3 : FORFILES를 저장하는 쉬운 방법이 있습니까? (수사적 질문 : 따옴표는 기능이나 결함입니까?)
"tokens=*"
다음과 같이 추가했습니다@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za