26

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

ОС - это Windows XP со всеми текущими обновлениями, но я могу запустить скрипт, если смогу рассказать, что он делает, хотя я бы предпочел не устанавливать dot-net, так как он мне действительно не нравится.

5 ответов5

27

Этот пакетный скрипт сделает это.

@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, текущее расширение пока отсутствует в списке и должно быть добавлено.

Эхо линии в основном выводит, и я также заменить мои заполнители : с новой строкой , чтобы сделать его хорошо выглядеть.

16

Несмотря на то, что он не соответствует требованиям для пакетного сценария, я использовал однострочный сценарий 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.

Любые подкаталоги там также не будут анализироваться, но результаты для всего остального будут отображаться.

4

Вот подробный ответ с помощью PowerShell (в Windows XP вам придется установить PowerShell):

Эй, автор сценариев! Как я могу использовать Windows PowerShell для выбора уникальных расширений файлов, используемых в коллекции файлов?

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

который я тогда смог использовать для своего проекта.

0

Чтобы получить список всех уникальных расширений из cmd по пути, который вы используете:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .