Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows

Модерирует : KLASS, IFkO

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Сценарии для Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru