Итак, я знаю, что с помощью этой команды мы можем просмотреть все файлы MKV/MP4 в текущей папке. Но я не хочу искать в Google и выяснять, какие все возможные типы файлов или расширения могут иметь подлинные видеофайлы .webm, .mkv, .mp4, .mov
и т. д.
Get-ChildItem -Filter *.mkv | Foreach { $_ }
Я хочу просмотреть все эти файлы, независимо от типов файлов или расширений, если их kind
является видеофайлом, я имею в виду, что если вы помните поиск по папкам Windows, там есть параметр kind:video
, который перечисляет все видео, не вдаваясь в расширение файла. вещи.
Как я могу сделать это с помощью сценария Powershell??
get-childitem *.webm,*.mkv,*.mp4,*.,mov
Использование com-объекта поиска Windows: stackoverflow.com/a/16295322/6654942
Что, если кто-то переименовал видеофайл example.mp4
в example.docx
, вы тоже хотите идентифицировать example.docx
как видеофайл?
@ js2010, отсутствие необходимости знать и явно перечислять отдельные расширения является заявленной предпосылкой вопроса. Ответ на основе COM API, на который вы ссылаетесь, на первый взгляд многообещающий, но, похоже, имеет свою проблему; Я добавил ссылку на нее и обсуждение своего ответа.
Что касается перспективы интерактивного графического интерфейса:Thanks, mclayton.
Поиск Windows заменяет Поиск на рабочем столе Windows (WDS) v2.x ; только последняя ссылка напрямую показывает такие примеры, как kind:video
, но первая указывает на документацию System.Kind, из которой следует, что kind:video
и псевдоним kind:videos
все еще поддерживаются.
На практике использование этих условий поиска в поле поиска Проводника дает файл изображения, а также несвязанные файлы .ts
(файлы TypeScript) из-за случайного столкновения имен с определением расширения имени файла в HKEY_CLASSES_ROOT\.ts
, которое указывает на тип файла WMP11.AssocFile.TTS
. , предназначенный для видеофайлов MPEG-2 TS. Возможны и другие подобные ложные срабатывания.
При программном использовании:
Вы можете эмулировать kind:video
— то есть запрос на поиск всех видеофайлов независимо от их формата — следующим образом:
# Get an array of wildcard patterns that match all filename extensions
# representing video files, e.g. @('*.3g2', ..., '*.mp4', ...)
$includePatterns =
(
Get-ItemProperty registry::HKEY_CLASSES_ROOT\.* -ErrorAction Ignore |
Where-Object PerceivedType -eq video
).PSChildName -replace '^', '*'
# Filter the target directory by those wildcard patterns.
# Note: If you're targeting the *current* directory, you can simplify to:
# Get-Item $includePatterns
# With a given path, make sure to append \*
# Add -Force to also match hidden files.
Get-Item .\* -Include $includePatterns # | ...
Примечание:
Приведенное выше находит расширения имен файлов, связанные с видеоформатами, которые уже зарегистрированы локально, поэтому они могут не охватывать все известные видеоформаты; см. следующий раздел для альтернативы, которая извлекает все расширения из онлайн-источника.
Локальные определения, запрошенные выше, хранятся в кусте реестра HKEY_CLASSES_ROOT
, где каждое известное расширение имени файла имеет свой собственный подраздел (например, HKEY_CLASSES_ROOT\.mp4
), значение PerceivedType
которого классифицирует файлы, использующие это расширение.
Предположительно, источником видеоформатов, используемых Windows Search, является тот же набор определений реестра; этот ответ на аналогичный вопрос показывает программное использование Windows Search через COM API, хотя в комментарии в предупреждении говорится, что он работает только с индексированными местоположениями, что исключает общие сетевые ресурсы и съемные диски. Кроме того, на практике я обнаружил, что kind:image
работает в интерактивном режиме с индексированной локальной папкой на C:, но не с эквивалентным решением COM API. Кроме того, такое решение еще более сложное и непонятное, чем решение на основе реестра, описанное выше; однако, когда оно работает, оно работает заметно быстрее, чем решение на основе реестра.
-Include
поддерживает несколько шаблонов в качестве аргумента (массива), разделенных ,
, которые, в отличие от одного шаблона, поддерживаемого -Filter
, интерпретируются как шаблоны подстановочных знаков PowerShell .[1]
Приведенное выше находит видеофайлы, расположенные непосредственно в текущем каталоге; для этого необходимо использовать Get-Item .\*
, а не Get-ChildItem
, к сожалению, из-за неинтуитивного способа функционирования параметра -Include
в настоящее время: см. нижний раздел этого ответа.
Чтобы найти видеофайлы во всем поддереве текущего каталога, замените Get-Item .\*
на Get-ChildItem . -Recurse
; -Include
с последним работает так, как и ожидалось.
-ErrorAction Ignore
в вызове Get-ItemProperty
используется для игнорирования ошибок, которые, к сожалению, могут возникнуть из-за ключей реестра, в именах которых есть встроенные символы /
, например. MAPI/IPM.Task
. Эти ошибки являются результатом того, что PowerShell по замыслу рассматривает оба /
и \
как разделители путей, хотя в контексте реестра Windows уместно только \
: см. выпуск GitHub #5536.
Онлайн-решение, основанное на парсинге веб-страниц:
Примечание:
Мне неясно, существует ли официальный онлайн-реестр всех расширений имен файлов, представляющих видеофайлы; Реестр IANA Media Types для видео определяет строки типов мультимедиа, но, по-видимому, не связанные с ними расширения имен файлов.
Приведенное ниже решение основано на веб-скрапинге https://fileinfo.com/filetypes/video
Как и в случае с методом графического пользовательского интерфейса и, возможно, с методом на основе реестра, могут быть ложные срабатывания из-за конфликтов имен; в частности, как указывает Маклейтон, в связанном источнике .xml
указан как расширение для типа файла Cinelerra Video Project
.
Поэтому вы можете захотеть реализовать жестко запрограммированные исключения для таких расширений.
$includePatterns =
[regex]::Matches(
(Invoke-RestMethod https://fileinfo.com/filetypes/video),
'(?<=<a href = "/extension/)[^"]+'
).Value -replace '^', '*.'
Get-Item * -Include $includePatterns | Foreach { $_ }
[1] See this answer for background information.
Возможно, я говорю о перекрестных целях, но кажется, что вы можете использовать поисковый запрос, например «kind:video» в поле поиска Windows Explorer: - например, см. i.sstatic.net/Mil281pB.png . Судя по всему, это часть «Windows Desktop Search 2.x», которая «устарела» и заменена «Windows Search» — см. Learn.microsoft.com/en-gb/windows/win32/lwef/… . Ключи реестра PerceivedType, похоже, также связаны — Learn.microsoft.com/en-gb/windows/win32/lwef/…
Этот код $includePatterns = ( Get-ItemProperty registry::HKEY_CLASSES_ROOT/.* -ErrorAction Ignore | Where-Object PerceivedType -eq video ).PSChildName -replace '^', '*' -join "','"
и мне пришлось заключить строку результата в кавычки, как я сделал здесь с запятой, потому что -Include
принимает только такой формат, как '*.mkv','*.mp4'
, с несколькими расширениями видео. Эта предыдущая строка дала мне все расширения видео, хотя только те, которые присутствуют в моей системе, а не то, что я ожидал, например, онлайн-вызов API, но все же, когда я ввожу шаблон -include
, он все равно не работает.
@mklement0 Я хочу сказать, что в вашем ответе все еще необходимы некоторые исправления, он дает мне расширения, но он не соответствует формату, необходимому для переключателя -include
, и поэтому не находит видео, несмотря на наличие нескольких видеофайлов типы, присутствующие в папке, в которой я ищу, например. mkv, mp4, тс и т. д.,
@mclayton Спасибо, я знал, что поиск по папкам Windows (верхняя правая панель @mklement0) можно использовать с любыми файлами, например kind:video
, потому что я использую его уже давно. И я просто хочу воспроизвести это с помощью сценария Powershell, но не ограничиваясь тем, что зарегистрировано как видео в моей ОС/жестком диске, а полным скомпилированным списком в Интернете, например, если новый формат видео не зарегистрирован в моем системном реестре, но если Я загрузил это видео и ни разу не просматривал его и не открывал, я все еще хочу, чтобы оно было найдено с помощью kind:video
поиска, который я выполняю с помощью этого сценария Powershell, который вы могли бы мне помочь создать.
@mclayton, спасибо за эти ссылки - я соответствующим образом обновил ответ; Значение PerceivedType
в реестре уже является основной частью решения в этом ответе.
@VickyDev: По параметру -Include
: моя вина: действительно, вы должны передать массив строк в -Include
, поэтому все, что было нужно, это удалить -join ','
из исходной формы этого ответа - смотрите мое обновление.
@VickyDev: Что касается вашего желания идентифицировать видеофайлы, независимо от того, определен ли их формат в локальном реестре: мне не ясно, kind:video
- чей программный эквивалент вы ищете - действительно выполняет такой вид онлайн-поиска. Если вы знаете, что это так: к какому источнику они обращаются? В любом случае вам следует обновить свой вопрос, чтобы явно указать это требование.
@VickyDev: я обновил ответ, чтобы показать пример получения всех расширений имен видеофайлов из fileinfo.com/filetypes/video - если вы знаете более авторитетный источник, дайте нам знать.
@mklement0 — npyw и +1, особенно. потому что ваш ответ также касается дополнительных требований ОП к исчерпывающим типам видео, но ваше предостережение о конфликтах расширений файлов также применимо к списку fileinfo.com с забавным .XML
для видеопроекта Cinelerra :-). Полагаю, ОП должен решить, хотят ли они найти все известные типы видео на свете, включая все ложные срабатывания, или просто тщательно подобранное подмножество…
@mklement0 Ваш обновленный ответ сработал идеально, а также решение онлайн-API, которое вы опубликовали, на данный момент является точным, так что я просто воспользуюсь им. Если я найду какой-либо другой, у которого есть больше списков типов видео, я обновлю его здесь. Большое спасибо!!
Рад это слышать, @VickyDev; Не за что.
Поиск в папке Windows не включает «Вид: видео». Вместо этого вы думаете о MacOS? Windows строго использует расширение файла для идентификации типов файлов и ничего больше.