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

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

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

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

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

KLASS



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Старые и смежные темы: по CMD и в Программах | по PowerShell | В помощь системному администратору | Прикладное программирование

PowerShell
Версии | Ассоциация и подпись сценариев
Сценарий для ассоциации файлов PowerShell и запуска неподписанных скриптов.
 
Прочее
Расширение возможностей
Функции
Write-Color
Output-DebugString
Провайдеры
Готовые скрипты
Полезные ссылки | Будет ли репозиторий PowerShell на ru-board?
Книги в PDF
Cheat Sheets
 

Cmd
Для перекодирования кириллицы 866<—>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы
 
Готовые решения и частые вопросы
 
Описания работы команд и символов участниками темы:
setlocal enabledelayedexpansion и переменные окружения
символы & и && в командной строке
Переменная %0
 
Полезные ссылки и утилиты

WSH (VBScript, JScript)
Программирование "удобняшек" на VBScript

Примечания:
• Большие куски кода заключайте в тэг [ more ]
• Чтобы не копировались концевые пробелы из форума, жмите на ссылку "Редактировать" в посте, и уже из редактора копируйте код без пробелов иначе сценарий может работать неправильно. Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
• Сторонние консольные утилиты можно использовать только в виде готового решения и только в рамках сценариев. Никаких обсуждений и обучений работе с утилитами не предусмотрено и прямо запрещено правилами топика.
Шапка и около-темные вопросы |

Всего записей: 11158 | Зарегистр. 12-10-2001 | Отправлено: 13:40 17-02-2018 | Исправлено: YuS 2, 08:24 19-06-2021
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
В общем, я запутался в этих классах... что и куда относить, где свойства, где методы, где события, а где обработчики событий...

И не ты один, нас много

Цитата:
ViewModel() {
        $S = Get-Service
        $this.SetServices($S)
    }

это конструктор, срабатывает при создании класса, когда зовём new(); new-object;
и да, тут получаются данные в свойство $Services, к которому биндиться список в форме, для этого это свойство.
$Services объект и через него получаем доступ к свойствам, методам наших данных
    PS>$Services = Get-Service
    PS>$Services. #CTRL+Space список по ctrl+spsce
    PS>$Services[0]. #CTRL+Space список по ctrl+spsce
SetServices это сеттер в общем то. он призван изменять свойство $Services и информировать об этом. Форма-список получает эту инфу.
можно добавить (перегрузить) конструктор с приёмом параметров

Цитата:
 ViewModel($S) {
        $this.SetServices($S)
    }

и создавать в инициализирующем коде, получив данные вне vm
$Services = Get-Service
$vm = [ViewModel]::new($Services)
 
В примере данные не изменяются, только получаются.
Вот и хотелось увидеть пример где работает и всё, что пока нашлось, не захватывает
Кто нибудь подключился бы из более грамотных, эхъ
 
Добавлено:

Цитата:
Function Get-Duration
Хорошая штука. Только у меня ошибки сыпятся, аа помогите для вложенной папки бы посчитать?
Кстати, как на инглиш сериалы, я обозвал папку Episodes?

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 21:21 13-09-2019 | Исправлено: iNNOKENTIY21, 21:56 13-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
можно добавить (перегрузить) конструктор с приёмом параметров

Вот, это уже ближе к делу.

Цитата:
В примере данные не изменяются, только получаются.

Ну, можно организовать изменение. Типа:
MVVM
Только в тиках таймера, надо добавить любое условие на изменение данных, чтобы они не обновлялись на каждый шаг.
 
Добавлено:
iNNOKENTIY21

Цитата:
для вложенной папки бы посчитать?

Хмм... а в шапке, скрипты сохраняем зачем?

Цитата:
 Получение детализированной информации из файлов.  

там, конечно, не прям то, что хочется, но легким движением, брюки превращаются... брюки превращаются... в элегантные шорты.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 23:36 13-09-2019 | Исправлено: YuS_2, 23:56 13-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
MVVM

Не. Таймер в vm, там с ним работать, стоп/старт/интервал… а в форме кнопочки/галочки, только не спрашивай как
На практике, повторюсь, оно поди и не нужно на пошике.
 
Что бы превратить брюки… примерить бы их Я не могу там прочитать код.
Буквы - переменные и экономия пробелов, пока расшифрую, быстрее переписать будет или подождать готовое.
Пока farag допилит
 

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 22:28 14-09-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Работает. Спасибо. Но почему не выводилось? Заметил, что обязательно нужны кавычки вокруг переменной?

Всего записей: 2478 | Зарегистр. 27-07-2009 | Отправлено: 22:49 14-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Таймер в vm, там с ним работать, стоп/старт/интервал…

Таймер здесь работает как приемник от модели, на событие изменения данных. Т.е. в тиках вместо $true, необходимо добавить проверку события изменения данных... как только True, то следует команда обновления модели, получение данных в $vm и далее передача в интерфейс. Вроде укладывается в схему...
 

Цитата:
а в форме кнопочки/галочки, только не спрашивай как

В форме кнопочки, галочки и прочее (события UI) - запросто. В чем проблема-то?
Если строго по схеме, оно так и должно быть.
У формы вообще много обработчиков событий:

Код:
$window|gm add* -m method -force

и у каждого элемента тоже...  
 

Цитата:
Я не могу там прочитать код.  
Буквы - переменные и экономия пробелов, пока расшифрую, быстрее переписать будет или подождать готовое.

да чего там расшифровывать:
Две функции.  
Одна разбирает $item на запчасти (если путь к корневому каталогу - создает коллекцию объектов-файлов из каталога, если путь к файлу - создает объект-файл).  

Код:
testpth $item

Можно создать выборку каталогов с абсолютными путями и подавать функции на вход.

Код:
dir $path -dir -rec|%{testpth $_.fullname}|%{info $_ 27}

Вторая - непосредственно, получение данных в цикле (цикл можно вообще исключить, заменив получением единственного свойства) и создание кастомных объектов с уникальными ID файла и с привязанными к ID файла ID параметров
Вызов со счетчиком, на получение коллекции свойств:

Код:
testpth $item|%{$n=1}{info $_ $n;$n++}

- на выходе testpth, может быть и коллекция и единственный файл.
 
Вызов на получение конкретного свойства:
чуть выше код уже есть с таким вызовом...
 
Далее свойства просто группируются и выводятся в отдельные текстовые файлы.
 

Цитата:
Пока farag допилит

Ну, чтобы ошибки не сыпались, при наличии подкаталогов, необходимо в функции указать для Get-ChildItem, что выбирать надо только файлы (см. ниже). А для подсчета общей продолжительности, предварительно формировать коллекцию каталогов, т.е. рекурсивно выбрать все каталоги и с полным путем подавать на вход функции, по одному... в конце просуммировать Duration, т.е. внутри функции совсем необязательно считать, если не требуется отдельно продолжительность по каждому каталогу.
 
 
farag

Цитата:
Но почему не выводилось?

Видимо, потому, что формируется коллекция кастомных объектов и именно она попадает в вывод функции, а переменная игнорируется, т.к. тип объекта другой - надо разбирать как работают функции вообще...
write-host просто выводит значение непосредственно в консоль, минуя автовывод функции.
 

Цитата:
Заметил, что обязательно нужны кавычки вокруг переменной?

Нет, в данном случае кавычки необязательны, вклеил их на автопилоте
Вообще, можно ещё так обойти этот момент:

Код:
Function Get-Duration {
    param ($TargetFolder)
    $shell = New-Object -ComObject Shell.Application
    $script:TotalDuration = [timespan]0
    Get-ChildItem -Path $TargetFolder -file | ForEach-Object -Process {
        $Folder = $shell.Namespace($_.DirectoryName)
        $File = $Folder.ParseName($_.Name)
        $Duration = [timespan]$Folder.GetDetailsOf($File, 27)
        $script:TotalDuration += $Duration
        [PSCustomObject] @{
            File = $_.Name
            Duration = $Duration
        }
    }
}
 
(Get-Duration D:\Загрузки\111 | Sort-Object Duration | Out-String).Trim()
$TotalDuration

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 01:16 15-09-2019 | Исправлено: YuS_2, 01:28 15-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Вроде укладывается в схему...  

Не, не укладывается.
В коде инициализации не должно быть все этого.
Логика вся в vm и обработка событий тоже.
В реалиях, еще класс настроек понадобиться, где настройка автообновление=да/нет и при нет, таймер вообще не нужно создавать. А события и команды точно так же биндятся в свойства vm. Но нужно реализовывать ICommand…
 

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 11:11 15-09-2019
farag



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Нет, в данном случае кавычки необязательны, вклеил их на автопилоте

Но без кавычек $TotalDuration не выводит ничего. Надо обязательно почему-то "$TotalDuration".

Всего записей: 2478 | Зарегистр. 27-07-2009 | Отправлено: 12:57 15-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
В коде инициализации не должно быть все этого.

Хмм, а где код инициализации? давай разграничивать будем...
Кто сказал, что VM - это класс и только?
Код инициализации, это, собственно, загрузка формы:

Код:
$Window = [Windows.Markup.XamlReader]::Parse($xaml)

и пуск таймера при загрузке формы:

Код:
$Window.add_loaded({
    $timer.start()
})

Это модель M:

Код:
$data = {get-service}

Это VM:

Код:
[ViewModel] $VM = [ViewModel]::new((&$data))

Это V:
собственно, код xaml.
 
Это связь M-VM-V:

Код:
$Window.DataContext = $VM
 
function update() {
    $VM.SetServices((&$data))
}

И остается только описание класса, которое мы легко можем отнести к VM.
Что именно не укладывается в схему? Не понял.
 

Цитата:
где настройка автообновление=да/нет и при нет, таймер вообще не нужно создавать.

таймер - вообще, вспомогательная штука. Таймер можно совсем убрать и заменить его кнопкой "обновление" и привязать к ней функцию update:

Код:
function update() {
    $VM.SetServices((&$data))
}

и поолучится, что запрос от V идет в VM, а VM, в свою очередь, получает данные от M и передает в V...
В общем, непонятно возражение по поводу отклонения от схемы...
 
Добавлено:
farag

Цитата:
Но без кавычек $TotalDuration не выводит ничего. Надо обязательно почему-то "$TotalDuration".

Не знаю, у меня выводит и без кавычек, нужен только write-host

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 13:48 15-09-2019 | Исправлено: YuS_2, 13:57 15-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
Код инициализации, это, собственно, загрузка формы:

Цитата:
и пуск таймера при загрузке формы:

  Нет. Инициализация — создание объектов. Формы, данных, модели представления.

Код:
$Window = [Windows.Markup.XamlReader]::Parse($xaml) # создание формы
$data = {get-service} # создание данных
[ViewModel] $VM = [ViewModel]::new($data) #связь данных с моделью представления
$Window.DataContext = $VM # связь формы с моделью представления


    $Window.add_loaded — этого, вообще быть не должно.
    таймер, update()     — логика и работа с данными = в модель представления.

  События или в форме (если не касается данных) или в модели представления (если хоть как касается данных).
 
  Делить на файлы. Каждый в принципе должен разрабатываться(не одним разрабом)/тестироваться отдельно
MainForm.xaml
MainFormInit.ps1
MainFormVM.ps1
Model.ps1
 
  Не пошик, но может понятнее, чем я пишут: WPF | Команды в MVVM
 

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 19:28 15-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Нет. Инициализация — создание объектов. Формы, данных, модели представления.

Ну, в принципе да, логично.
 

Цитата:
События или в форме (если не касается данных) или в модели представления (если хоть как касается данных).

А тут вот не вижу аргументации - почему так?
И к тому же: перешел по ссылке и в первых же строках:

Цитата:
Для взаимодействия пользователя и приложения в MVVM используются команды. Это не значит, что вовсе не можем использовать события и событийную модель, однако везде, где возможно, вместо событий следует использовать команды.

Но, вот это вот "следует использовать", опять же ничем не аргументируется. В смысле почему не использовать то, что предоставляет язык? Мы ведь не в C# пишем, для компиляции, а всего лишь скрипт powershell и если инструменты существуют, то почему не пользоваться? Вот, что непонятно.
 
Далее:

Цитата:
$Window.add_loaded — этого, вообще быть не должно.

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

Цитата:
таймер, update()     — логика и работа с данными = в модель представления.

по таймеру - понятно...
update - можно и сейчас вынести в:

Код:
$vm.services.refresh()

но чего-то там не хватает... данные обновляются в VM, но в интерфейс не передаются, я проверял.
 

Цитата:
Каждый в принципе должен разрабатываться(не одним разрабом)/тестироваться отдельно

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

Цитата:
Не пошик, но может понятнее, чем я пишут: WPF | Команды в MVVM

Да, читал ранее, бегло и не вдумчиво, ибо не powershell...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:11 15-09-2019 | Исправлено: YuS_2, 20:35 15-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2

Цитата:
В смысле почему не использовать то, что предоставляет язык?

Никто не запрещает, по ссылке же написано.
Но, если следовать за MVVM, то надо разделять на независимые слои.
Дабы убрать (хотя бы уменьшить связность) разрабатывать и тестировать, раздельно, каждый модуль.
 
$Window.add_loaded повышает связность, если касается исключительно формы и не касается данных то в форме ему место, но никак ни в инициализации. В vm, тоже не вариант, опять же vm не знает о window и не должна. Если данных касается то делается не так, а привязкой данных, как $Services, только для события формы.

Цитата:
но чего-то там не хватает... данные обновляются в VM, но в интерфейс не передаются, я проверял.
Поэтому и не 100% рабочий

Цитата:
попроще чего-нибудь

А тут, поэтому и писал, что вряд ли это так уж нужно на пошике, хоть мне и любопытно
 
 
Добавлено:
farag

Цитата:
Но без кавычек $TotalDuration не выводит ничего. Надо обязательно почему-то "$TotalDuration".

Вот тоже интересно, может где глобальный атрибут, какой, отключает это дело.
 
Я хз точно, но предположу (пальцем в небо), что два объекта, пошик пытается объединить в один, не выходит, один игнорирует.
А когда кавычки или write-host и т.д. преобразование в строку, её выводит.
XML для вывода никто не делает?
 
Идеологически правильно делить такие функции. Массив данных и итог.

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 21:10 15-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Но, если следовать за MVVM, то надо разделять на независимые слои.  
Дабы убрать (хотя бы уменьшить связность) разрабатывать и тестировать, раздельно, каждый модуль.

А, ну если в этом смысл... то понятно. Но это уже не сильно интересно, пока, на данном этапе...
 

Цитата:
$Window.add_loaded повышает связность, если касается исключительно формы и не касается данных то в форме ему место, но никак ни в инициализации.

Ещё раз, этот обработчик события вообще используется независимо, только для пуска таймера. Таймер не имеет отношения к форме напрямую, только для имитации действий пользователя, вместо нажатия кнопок...
Ну, да ладно, это дело третье. Для кнопки, всё равно, в таком варианте, пришлось бы использовать другой обработчик, всего лишь, т.е. проблема не исчезла бы.
 

Цитата:
Поэтому и не 100% рабочий

Есть предположение, что Services у нас и не изменяется, если останавливать и запускать сервисы, а вот при удалении/добавлении - возможно и будет... надо проверять.
 

Цитата:
вряд ли это так уж нужно на пошике, хоть мне и любопытно

Нужно всё, что вызывает любопытство...
 

Цитата:
что два объекта, пошик пытается объединить в один, не выходит, один игнорирует.

Вероятнее всего, ибо объекты имеют различный тип.
 

Цитата:
А когда кавычки или write-host и т.д. преобразование в строку, её выводит.

просто с кавычками, тоже не выведет, ибо тоже не подходящий тип данных, а write-host перенаправляет вывод в консоль(причем с более высоким приоритетом), всего лишь, вместо автоматического write-output.

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 22:00 15-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вот вышел каменный цветок

Код:
function Get-Duration {
    param (
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [ValidateScript( { Test-Path -Path $_ -PathType Container } )]
        [string[]] $Path
    )
 
    begin {
        [System.__COMObject] $Shell = New-Object -ComObject Shell.Application
 
        $Params = @{
            Name        = 'ID_PROPERTY_DURATION'
            Value       = 27
            Option      = 'Constant'
            Visibility  = 'Private'
            Description = 'Идентификатор свойства "Проодника" — "Продолжительность"'
            Force       = $true
        }
 
        Set-Variable @Params
    }
 
    process {
        $Files = Get-ChildItem -Path $Path -File
 
        foreach ($File in $Files) {
            $Folder = $Shell.Namespace($File.DirectoryName) # для каждого файла папку?
            $FileName = $Folder.ParseName($File.Name)
            $Duration = [timespan] $Folder.GetDetailsOf($FileName, $ID_PROPERTY_DURATION)
            $File | Add-Member -MemberType NoteProperty -Name Duration -Value $Duration
            $File
        }
    }
}

Так его использовать

Код:
$Path = 'F:\Download\Episodes', 'F:\Download\Episodes\По долгу службы'
$GetDDuration = Get-Duration $Path
 
$Sum = [timespan]::Zero
 
foreach ($Duration in $GetDDuration.Duration) { $Sum += $Duration }
 
$GetDDuration | Format-Table -AutoSize Name, Length, Duration -GroupBy Directory
"Общая продолжительность: " + $Sum.ToString()

Или так

Код:
$Path = 'F:\Download\Episodes', 'F:\Download\Episodes\По долгу службы'
$AllSum = [timespan]::Zero
 
foreach ($Item in $Path) {
    $GetDDuration = Get-Duration $Item
    $Sum = [timespan]::Zero
    foreach ($Duration in $GetDDuration.Duration) { $Sum += $Duration }
 
    $GetDDuration | Format-Table -AutoSize Name, Length, Duration
    $Item + " — Общая продолжительность: " + $Sum.ToString()
    $AllSum += $Sum
}
 
"Общая продолжительность: " + $AllSum.ToString()

 
А как бы сразу с подкаталогами, а если вложенность -gt 3…

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 23:43 15-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
А как бы сразу с подкаталогами, а если вложенность -gt 3


Код:
function testpth($x){
    if(test-path $x -pathtype container){
        dir -lit $x -inc $flt|?{!$_.psiscontainer}
    } elseif (test-path $x -pathtype leaf){
        gi -lit $x
    } 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)
        $rslt = $b.getdetailsof($b.parsename($var.name),$propnum)
        if($rslt){
            [pscustomobject]@{
                IDFile = $k
                IDProp = $propnum
                Name = $var.name
                FullName = $var.fullname
                Type = $b.getdetailsof($null,$propnum)
                Context = $rslt
            }
        }
    }
}
 
$path = 'e:\root'
$flt = '*.mpg','*.avi','*.mkv','*.mp4','*.3gp','*.vob'
$propnum = 27
 
$arr = (dir -lit $path -dir -rec)+(gi -lit $path)|
%{testpth $_.fullname}|%{$n=0}{info $_ $n;$n++}
 
$arr|ft idprop,fullname,context
try{
    $total = [timespan]::new(0,0,(([timespan[]]$arr.context).totalseconds|
    measure -sum).sum)
    "Общая продолжительность: $total"
}catch{
    write-host 'Context' не является продолжительностью медиафайла: "`n" $_ -for red
}

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 09:22 16-09-2019 | Исправлено: YuS_2, 09:43 16-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
У меня ошибку выдаёт

Код:
Сбой вызова метода из-за отсутствия в [System.IO.DirectoryInfo] метода с именем "op_Addition".
строка:34 знак:1
+ $arr = (dir -lit $path -dir -rec) + (gi -lit $path)|
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 19:56 16-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
У меня ошибку выдаёт

а, ну да, если подкаталог один, то будет такая ошибка...

Код:
$arr = [array](dir -lit $path -dir -rec) + (gi -lit $path)|...

спасет положение...
Но у меня тут есть уже обновленный скрипт из шапки:

Код:
[CmdletBinding()]
Param (
    [string[]]$items = ('file.mp4','d:\root'),
    [string[]]$filter = ('*.mpg','*.avi','*.mkv','*.mp4','*.3gp','*.vob'),
    [ValidateRange(0,1024)]
    [int[]]$propnum = (27..28+29..30+500), # или (1,4,18)
    [switch]$recurse,
    [switch]$force
)
 
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
                    Type = $b.getdetailsof($null,$i)
                    Context = $rslt
                }
            }
        }
    }
}
 
$arr = $items|%{testpth $_}|%{$n=0}{info $_ $n;$n++}
 
$arr|ft idfile,idprop,fullname,type,context
if ($propnum.length -eq 1 -and $propnum -eq 27){
    try{
        $total = [timespan]::new(0,0,(([timespan[]]$arr.context).totalseconds|
        measure -sum).sum)
        "Общая продолжительность: $total"
    }catch{
        write-host 'Context' не является продолжительностью медиафайла: "`n" $_ -for red
    }
}
 
<#
# Подготовка хэш-таблиц с последующей группировкой
$p = $arr|group idfile -ashash -asstr
# Вывод в отдельные файлы
1..$p.count|%{
    $name = [string]($p."$_".context[0]) + '.txt'
    $p."$_"|out-file -app -lit $name
}
#>

Он пока не закончен ещё, но пользоваться можно... только вывод подправить как требуется и всё, в этой строке:

Код:
$arr|ft idfile,idprop,fullname,type,context

Пример использования:

Код:
.\script.ps1 -item 'd:\root1','d:\root2','d:\root3\file.mp4' -propnum 27 -recurse -force

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:56 16-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
YuS_2
Нет группировки по каталогам
 
 
А зачем ValidateRange(0,1024)

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 21:22 16-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Нет группировки по каталогам

В перечень кастомного объекта надо добавить свойство

Код:
DirectoryName = $var.directoryname

и будет группировка...
 

Цитата:
А зачем ValidateRange(0,1024)

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

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:48 16-09-2019
iNNOKENTIY21



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Список доступных свойств

Код:

function Get-FileExtendedPropertiesList {
    param (
        # Полный путь к папке
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [ValidateScript( { Test-Path -Path $_ -PathType Container } )]
        [string] $Path
    )
 
    $ShellApp = New-Object -ComObject Shell.Application
    $Folder = $ShellApp.Namespace($Path)
 
    foreach ($Id in (0..0xFFFF)) {
        $Name = $Folder.GetDetailsOf($null, $Id)
 
        if (!$Name) {
            break
        }
 
        [PSCustomObject] @{
            Id   = $Id
            Name = $Name
        }
    }
}

0xFFFF — с потолка, хз какие ограничения

Всего записей: 3523 | Зарегистр. 16-08-2012 | Отправлено: 00:18 17-09-2019
YuS_2



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
iNNOKENTIY21

Цитата:
Список доступных свойств

Это каталога.
А список доступных свойств файла, может варьироваться в зависимости от типа файла...  
 

Цитата:
с потолка, хз какие ограничения

вот и мне было лень копать...  
1024 - просто прогнал несколько файлов и свойств там было не больше...

Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 08:15 17-09-2019 | Исправлено: YuS_2, 08:19 17-09-2019
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226

Компьютерный форум 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