Як витягнути повний список типів розширень в каталозі?


28

Всередині каталогу та рекурсивно в його підкаталогах, тобто кожен каталог у каталозі обробляється, як я складаю повний список унікальних розширень всередині каталогу?

ОС - це Windows XP з усіма поточними оновленнями, але я добре працюю із сценарієм, якщо я можу сказати, що це робить, хоча я вважаю за краще не встановлювати dot-net, оскільки мені це дуже не подобається.

Відповіді:


29

Цей пакетний сценарій це зробить.

@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команду, для забезпечення унікальності. Текстовий висновок команди пошуку посилається до nul, по суті, чорної діри - ми цього не хочемо. Оскільки ми завжди додаємо а :в кінці списку, ми також повинні переконатися, що пошуковий запит закінчується :так, щоб він не відповідав частковим результатам - дивіться коментарі.

% ERRORLEVEL% встановлюється findкомандою, значення 0 вказує на відповідність. Тож якщо це не 0, поточне розширення наразі відсутнє у списку, і його слід додати.

Лінія відлуння в основному виводить, і я також замінюю свої заповнювачі ( :) новими рядками, щоб це виглядало приємно.


+1 @Bob: Дивовижна відповідь, додавши пояснення, також була велика допомога. Просто тестували сценарій, переглядали результати тесту, і все працювало чудово. Ще раз дякую!
промахи

1
Це спрацювало ПЕРФЕКТНО! Я використав такий синтаксис:batchfile "path" >filename.txt
lucaferrario

Чудовий сценарій! Але з цим є невелика помилка: якщо в папці містяться файли aaa.cssі zzz.cs, розширення .csне буде повідомлено про сценарій.
Гузак

1
@Goozak Whoops. Виправлено зараз. Чудеси пошуку тексту ... повинні були переконатися, що пошуковий запит закінчився, :щоб змусити його відповідати межам.
Боб

19

Хоча строго не відповідає вимозі пакетного сценарію, я використовував однорядковий сценарій оболонки:

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.

Будь-які підкаталоги там також не будуть проаналізовані, але результати для всього іншого все одно покажуть.


Дякую, погоджуйся, що це корисна відповідь. На непов’язаній ноті трохи спантеличено, як ви опублікували лише одну відповідь, але ще маєте значок "Фанатик" для відвідування Суперрусера протягом 100 днів поспіль. У вас сайт закладений у закладки чи щось таке?
помилки

Значок був нагороджений у 2010 році, коли я фактично ховався, але я набагато активніший на SO: stackoverflow.com/users/31532/dan-atkinson . :)
Ден Аткінсон

4

1
Хоча PowerShell, безумовно, набагато простіше, ніж командний рядок, він базується на .NET. Що, на жаль, суперечить "я б вважав за краще не встановлювати dot-net".
Боб

1
+1 @RichardM: погоджуйся з Боб. Також код, пов’язаний з підрахунком знайдених екземплярів розширень - нічого не знаючи про PowerShell - здається дуже важким у пам'яті; значить замість того, щоб просто зберігати кількість кожного екземпляра, я вважаю, що створити масив для зберігання повторюваних екземплярів розширення для кожного розширення, а потім зробити підрахунок для кожного масиву розширень в кінці, що мені здається дуже дивним способом підрахунок екземплярів розширень. Я щось пропускаю? (Ось уже сказано, перший однокласник PowerShell приємний, і я б спробував це, якби мені не подобався dotnet.)
помилки

1
Це справедливо. Це питання може залучити шукачів, які є більш відкритими до рішення PowerShell. Зауважте, гідний пошук Google знайде і вище посилання.
RichardM

3
+1 для цього посилання. помилки очевидно не любить все .net, але це не означає, що рішення вище - найкраще довгострокове рішення цієї проблеми. Чим більше мов, тим краще я думаю.
Стів Ретбон

1
Ось ще одне посилання, яке стосується рекурсивного пошуку, використовуючи посилання shell. robertbigec.wordpress.com/2011/01/07/…
goodeye

0

Щоб перерахувати всі унікальні розширення від cmd під шляхом, який ви використовуєте:

Powershell -Command "Get-ChildItem . -Include *.* -Recurse | Select-Object Extension | Sort-Object -Property Extension -Unique"

0

Мені здалося корисним змінити

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

яку я тоді міг використати для свого проекту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.