YuS_2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: #requires -v 3.0 <# .SYNOPSIS Скрипт для получения строк детализированной информации из файлов. .Description Получает дополнительные свойства из файлов, в зависимости от выбранных параметров. Для получения свойств одного файла, можно указать его с относительным или абсолютным путем. Для массового получения свойств - необходимо указать каталог с файлами. Скрипт параметризированный. .Parameter Items Обязательный: Указываются файлы или каталоги (в случае каталога, будут выбраны файлы содержащиеся в нем по фильтру) .Parameter Filter Необязательный: Фильтр для отбора файлов. Поддерживаются маски .Parameter Propnum Необязательный: Единственный номер параметра или диапазон параметров, или набор параметров. См. примеры .Parameter Recurse Переключатель: При наличии, будет осуществляться рекурсиваня выборка файлов из каталогов. Для элементов-файлов, переключатель игнорируется. .Parameter Force Переключатель: При наличии, будут выбираться скрытые, системные и т.п. файлы. .Parameter Outfiles Переключатель: Для осуществления вывода в отдельные файлы. Имя файла будет составлено из имени и расширения обрабатываемого файла и нового расширения .txt Файлы складываются рядом со скриптом. .Example .\script.ps1 -item 'd:\root1','d:\root2','d:\root3\file.mp4' -propnum 27 -recurse -force Это пример выборки файлов, указанных в перечислении -items, для дальнейшей обработки, Будет получено свойство с номером 27. Каталоги из перечисления будут обработаны рекурсивно для выборки всех файлов. .Example .\script.ps1 -item 'd:\root1' -propnum (1..2048) -force Это пример выборки файлов из указанного каталога, для дальнейшей обработки. Будут получены свойства с номерами от 1 до 2048. Выбираются все файлы. .Example .\script.ps1 -item 'd:\root1' -filter ('*.mpg','*.avi','*.mkv','*.mp4','*.3gp','*.vob') ` -propnum 27 |ft Это пример выборки файлов из указанного каталога, для дальнейшей обработки. Будет получено свойство с номером 27. Выбираются только доступные файлы и только с указанными расширениями в фильтре. .Notes Created By YuS Version: 1.00 Date: 2/04/2018 Purpose/Change: Первая версия Version: 2.00 Date: 17/09/2019 Purpose/Change: Изменена логика скрипта, добавлена возможность выборки набора свойств. Добавлена возможность вывода в консоль. Добавлен подсчет общей продолжительности медиафайлов, если выбрано единственное свойства 27. Расширена возможность группировки по параметрам. Поправлены старые баги, добавлены новые. :) .Link http://forum.ru-board.com/topic.cgi?forum=33&topic=11963&start=920#16 #> [CmdletBinding()] Param ( [parameter(mandatory=$true)] [string[]]$items, [string[]]$filter = '*.*', [ValidateRange(0,2048)] [int[]]$propnum = 27, [switch]$recurse, [switch]$force, [switch]$outfiles ) function testpth($x){ $pars = @{} $pars.path = [management.automation.wildcardpattern]::escape($x) if ($force){$pars.force = $true} if ($filter){$pars.include = $filter} if(test-path $x -pathtype container){ $pars.path += '\*' if ($recurse){$pars.recurse = $true} dir @pars|?{!$_.psiscontainer} } elseif (test-path $x -pathtype leaf){ gi @pars } else { write-host Path no correct sleep -s 5 break } } function info($var,$k){ process{ $a = new-object -com 'shell.application' $b = $a.namespace($var.directoryname) [int]$i=0 foreach($i in $propnum){ $rslt = $b.getdetailsof($b.parsename($var.name),$i) if($rslt){ [pscustomobject]@{ IDFile = $k IDProp = $i Name = $var.name FullName = $var.fullname DirectoryName = $var.directoryname Type = $b.getdetailsof($null,$i) Context = $rslt } } } } } $arr = $items|%{testpth $_}|%{$n=1}{info $_ $n;$n++} if ($outfiles){ # Подготовка хэш-таблиц с последующей группировкой $p = $arr|group idfile -ashash -asstr # Вывод в отдельные файлы 1..$p.count|%{ if($p."$_".idprop.length -eq 1){ $name = [string]$p."$_".name + '.txt' }else{ $name = [string]$p."$_".name[0] + '.txt' } $p."$_"|ft idfile,idprop,fullname,type,context -auto|out-file -lit $name -app -enc utf8 } } else { $arr } if ($propnum.length -eq 1 -and $propnum -eq 27){ try{ $total = [timespan]::new(0,0,(([timespan[]]$arr.context).totalseconds| measure -sum).sum) write-host "Общая продолжительность: $total" -for cyan }catch{ write-host 'Context' не является продолжительностью медиафайла: "`n" $_ -for red } } | | Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:53 02-04-2018 | Исправлено: YuS_2, 21:24 17-09-2019 |
|