Создать текстовый файл, содержащий список всех файлов определенного типа с указанием их размера - PullRequest
1 голос
/ 16 марта 2019

Я хочу создать текстовый файл со всеми именами файлов определенного типа плюс размер файла, рекурсивно из указанного каталога и всех подкаталогов.

Например: список всех .jpg файлов плюс их размеры из огромной коллекции фотографий.

Я нашел несколько похожих вопросов, но не этот конкретный список.

Кто-то сделал это с полным именем пути, но мне это не нужно, и оно станет очень длинным. Другой перечисляет все файлы, но без размера. В другом перечислены все имена файлов с размером, но я не могу указать тип файла.

Эта команда PowerShell создает желаемый список, но я не знаю, как ограничить его определенным типом файла (например, .jpg)

gci -rec|?{!$_.PSIsContainer}|%{"$($_.Fullname) $($_.Length)"} >filelist.txt

В этом batch file перечислены все .jpg, но без отображения размера файла.

dir /b /s z:\Filme\*.jpg > list1.txt
for /f "tokens=*" %%A in (list1.txt) do echo %%~nxA >> list.txt
del list1.txt

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

Ответы [ 6 ]

1 голос
/ 16 марта 2019

Другой вариант - не использовать параметр -Filter, а вместо -Include, где шаблон подстановки работает, как и ожидалось, например:

PowerShell версии 3.0 и выше

Get-ChildItem 'z:\Filme' -File -Include '*.jpg' -Recurse | 
    Select FullName, Length | 
    Export-Csv '.\FileList.csv' -NoTypeInformation

Версия PowerShell ниже 3.0

Get-ChildItem 'z:\Filme' -Include '*.jpg' -Recurse | 
    Where-Object { !$_.PsIsContainer} | 
    Select FullName, Length | 
    Export-Csv '.\FileList.csv' -NoTypeInformation


Обратите внимание, что -Include работает только в том случае, если вы также указали -Recurse или если у вас конец пути в \*, как в Get-Childitem 'z:\Filme\*'. Кроме того, -Filter работает быстрее, чем -Include (или -Exclude) параметров. Как указано в документах :

"Фильтры более эффективны, чем другие параметры, поскольку поставщик применяет их, когда командлет получает объекты. В противном случае PowerShell фильтрует объекты после их получения."

1 голос
/ 16 марта 2019

Вывод текста:

Get-ChildItem -Path 'X:\PHOTO' -Filter '*.jp*g' -Recurse | 
    Where-Object {-not $_.PsIsContainer} | 
        Select-Object Name, Length | 
            Out-File -FilePath '.\FileList.txt'

Выход CSV:

Get-ChildItem -Path 'X:\PHOTO' -Filter '*.jp*g' -Recurse | 
    Where-Object {-not $_.PsIsContainer} | 
        Select-Object Name, Length | 
            Export-Csv -Path '.\FileList.csv' -NoTypeInformation

P.S. Я использовал *.jp*g подстановочный знак, который также будет соответствовать *.jpeg файлам. К сожалению, * подстановочный знак соответствует нулю или большему количеству символов, поэтому вы можете получить файлы типа zzz.jpXXXg в своем списке. Существуют и другие способы фильтрации вывода Get-ChildItem, которые не страдают от этой проблемы, например фильтрация с помощью конвейера и регулярного выражения, но они медленнее: Where-Object {$_.Extension -match '^\.jp[e]{1}g$'}

1 голос
/ 16 марта 2019

Вы знаете о модификаторе %%~nxA, поэтому я немного удивлен, что вы не заметили модификатор %%~zA.

Чтобы еще больше упростить его, используйте цикл for /R и не используйте временный файл:

(for /R %%A in (*.jpg) do echo %%~nxA %%~zA)>list.txt

или если вам нужен полный путь \ имя, используйте %%~fA (явный) или даже просто %%A

0 голосов
/ 16 марта 2019

Я никогда не изучал компоновку из команды Where, но если она не меняется между языками / локалями, или технически, если ваша компоновка не слишком отличается от моей тестовой системы , Вы можете сделать это на своей машине так:

Из командной строки:

(For /F "Tokens=1,3*" %A In ('Where/T /R . *.jpg 2^>Nul')Do @Echo("%C","%A")>"list.txt"

Из пакетного файла:

@(For /F "Tokens=1,3*" %%A In ('Where/T /R . *.jpg 2^>Nul')Do @Echo("%%C","%%A")>"list.txt"

Очевидно, что если компоновка из вывода команды Where отличается, все равно есть возможность настроить Tokens и / или включить разделители в соответствии с вашей целевой системой.

В приведенных выше примерах я использовал . для представления текущего каталога, вы, конечно, можете изменить его на другой относительный путь, например, ..\Pictures или полный путь, например C:\Users\Patrick\Pictures при необходимости.


И опция :

Ls -Filt '*.jpg' -Fo -Rec -EA SilentlyContinue|?{!$_.PSIsContainer -And $_.Extension -Eq '.jpg'}|Select FullName,Length|ConvertTo-CSV -NoT|Select -Skip 1|SC '.\list.txt'

Это также включает, например, системные и скрытые файлы, не будут включать файлы с расширениями, отличными от .jpg, и не будут содержать незапрошенный заголовок с этим списком.

0 голосов
/ 16 марта 2019

попробуйте

Get-ChildItem "yourdir" -File -Filter '*.jpg' -Recurse | 
    Select FullName, Length | 
        Export-Csv '.\FileList.csv' -NoType
0 голосов
/ 16 марта 2019

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

Вы почти там с пакетным скриптом.

%~z1 отобразит размер файла (в байтах).

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

Используйте следующий пакетный файл:

@echo off
setlocal
for /f "tokens=*" %%A in ('dir /b /s z:\Filme*.jpg') do (
  if /i "%%~xf" equ ".jpg" echo %%~nxf %%~zf
  ) > list.txt
endlocal

Дальнейшее чтение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...