답변:
이 배치 스크립트가이를 수행합니다.
@echo off
set target=%~1
if "%target%"=="" set target=%cd%
setlocal EnableDelayedExpansion
set LF=^
rem Previous two lines deliberately left blank for LF to work.
for /f "tokens=*" %%i in ('dir /b /s /a:-d "%target%"') do (
set ext=%%~xi
if "!ext!"=="" set ext=FileWithNoExtension
echo !extlist! | find "!ext!:" > nul
if not !ERRORLEVEL! == 0 set extlist=!extlist!!ext!:
)
echo %extlist::=!LF!%
endlocal
.bat
파일을 파일 로 저장 하고 명령을 사용하여 파일 batchfile
이름을 바꾸고 현재 디렉토리를 나열하거나로 경로를 지정하십시오 batchfile "path"
. 모든 하위 디렉토리를 검색합니다.
파일로 내보내려면 batchfile >filename.txt
(또는 batchfile "path" >filename.txt
)를 사용하십시오.
for /f...
줄 앞의 모든 것이 설정됩니다. 검색 할 대상 디렉토리를 가져오고 지연된 확장 을 활성화 하여 루프에서 변수를 업데이트 하고 더 깔끔한 출력에 사용할 수 있는 줄 바꿈 ( LF
) 을 정의합니다 . 아, 그리고 %~1
의미는 인용 부호를 두 배로 막는 "첫 번째 인수를 받아 따옴표를 제거하십시오" 라는 의미 for /?
입니다.
루프는 해당 dir /b /s /a:-d "%target%"
명령을 사용 하여 대상 아래의 모든 하위 디렉토리에있는 모든 파일 목록을 가져옵니다.
%%~xi
dir
명령이 반환 하는 전체 경로에서 확장명을 추출 합니다.
빈 확장명은 "FileWithNoExtension"으로 바뀌므로 이러한 파일이 있다는 것을 알 수 있습니다. 빈 줄을 대신 추가하면 그다지 명확하지 않습니다.
find
고유성을 보장하기 위해 명령을 통해 전송 된 경우 전체 현재 목록 입니다. find 명령의 텍스트 출력은 nul
기본적으로 블랙홀로 보내집니다 – 우리는 원하지 않습니다. 우리는 항상 :
목록의 끝에 a 를 추가하기 때문에 검색 쿼리가 :
부분 결과와 일치하지 않도록 검색 질의로 끝나야합니다 ( 주석 참조).
% ERRORLEVEL %은 find
명령에 의해 설정되며 값 0은 일치하는 것을 나타냅니다. 따라서 0이 아닌 경우 현재 확장명은 지금까지 목록에 없으므로 추가해야합니다.
반향 줄은 기본적으로 출력되며 자리 표시 자 ( :
)를 줄 바꿈으로 바꿔서 보기 좋게 만듭니다.
batchfile "path" >filename.txt
aaa.css
와 zzz.cs
, 확장은 .cs
스크립트에 의해보고되지 않습니다.
:
경계와 일치하도록 강제 종료해야했습니다 .
배치 스크립트의 요구 사항을 엄격하게 충족 시키지는 않지만 한 줄짜리 powershell 스크립트를 사용했습니다.
Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt
명령 행 / 배치 파일에서 잠재적으로 실행할 수 있습니다.
Powershell -Command "& Get-Childitem C:\MyDirectory -Recurse | WHERE { -NOT $_.PSIsContainer } | Group Extension -NoElement | Sort Count -Desc > FileExtensions.txt"
나는 그것을 인정하지 않으며 물론 Powershell을 설치해야합니다. 최신 버전의 Windows에서는이 문제를 해결할 수 없습니다.
제거 C:\MyDirectory
하면 현재 디렉토리에서 실행됩니다.
결국 다음과 같은 것을 포함하는 FileExtensions.txt가 생성됩니다.
+-------+------+
| Count | Name |
+-------+------+
| ----- | ---- |
| 8216 | .xml |
| 4854 | .png |
| 4378 | .dll |
| 3565 | .htm |
| ... | ... |
+-------+------+
폴더 구조에 따라 경로가 길다는 오류 메시지가 표시 될 수 있습니다.
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
하위 디렉토리도 파싱되지 않지만 다른 모든 결과는 계속 표시됩니다.
PowerShell을 사용하는 자세한 답변은 다음과 같습니다 (Windows XP의 경우 PowerShell을 설치해야 함).
스크립팅 가이! Windows PowerShell을 사용하여 파일 모음에 사용 된 고유 한 파일 확장명을 선택하려면 어떻게해야합니까?
나는 변경하는 것이 유용하다는 것을 알았다
if "!ext!"=="" set ext=FileWithNoExtension
에
if "!ext!"=="" set ext=.FileWithNoExtension
그리고 변경
echo %extlist::=!LF!%
에
echo %extlist::=!LF!% > ext-list.txt
생성 된 파일에는 (줄 바꿈은 없지만 상관 없음) .bat.pdf.skp.ai.png.jpg.tif.pcp.txt.lst.ttf.dfont.psd.indd.docx.PDF.JPG.gif.jpeg가 포함되어 있습니다. .dwg.exr.FileWithNoExtension.vrlmap.sat.bak.ctb
프로젝트에 사용할 수있었습니다.