Задание Powershell не может найти System.windows.forms

Я хочу запустить фоновое задание в моем PowerShell-Script, чтобы прочитать все значки файлов из определенной папки в [System.Windows.Forms.ImageList].

$JobScript = {
    param([String] $Path)
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing
    
    $Files = [System.IO.DirectoryInfo]::new($Path).GetFiles()
    [System.Windows.Forms.ImageList] $ImgList = [System.Windows.Forms.ImageList]::new()
    $Files.ForEach({
        $Extension = [System.IO.FileInfo]::new($_.FullName).Extension
        if ($Extension -notin $ImgList.Images.Keys)
        {
            $ImgList.Images.Add($Extension, [System.Drawing.Icon]::ExtractAssociatedIcon($_.FullName))
        }
        
    })
    $ImgList
}

$Job = Start-Job -ScriptBlock $JobScript -ArgumentList "C:\Windows"
#Do other stuff
Wait-Job $Job
Receive-Job $Job

Код генерирует множество ошибок, утверждая, что ни [System.Drawing.Icon], ни [System.Windows.Forms.ImageList] не найдены. Когда я запускаю код без задания, он работает нормально. Как ни странно, пространство имен System.IO работает нормально.

Я предполагаю, что мне нужно использовать add-type внутри блока сценария, но как мне добавить с ним эти системные типы?

РЕДАКТИРОВАТЬ: я обновил код с помощью комментария Матиаса.


person GuidoT    schedule 22.04.2021    source источник
comment
Большое спасибо! Но он выдает «Сборка System.Drawing.Icon не может быть найдена». ошибка. System.Windows.Forms, похоже, работает. Изменить: я сделал ошибку при добавлении типа, теперь он работает. Но теперь он выдает много исключений, говоря: ExtractAssociatedIcon - FileNotFoundException Но файлы на самом деле существуют.   -  person GuidoT    schedule 22.04.2021
comment
Вам нужно имя содержащей сборки, а не имя конкретного типа: Add-Type -AssemblyName System.Drawing   -  person Mathias R. Jessen    schedule 22.04.2021
comment
Теперь это работает. :-) Я также обнаружил ошибку, связанную с FileNotFoundExceptions... Мне пришлось получить свойство FullName из Files-iterator.   -  person GuidoT    schedule 22.04.2021
comment
Я заметил, что это решение не работает, например. если вы попытаетесь передать System.Drawing.Icon такому заданию, как $JobScript = {param([System.Drawing.Icon] $Ico); #...} так как в тот момент add-type не выполнялся... Как бы вы могли решить этот случай, пожалуйста? Я знаю, что могу просто использовать System.Object в качестве обходного пути, но я хотел бы знать...   -  person GuidoT    schedule 22.04.2021
comment
Неважно. При передаче любого объекта командлету Start-Job будет передана только поврежденная копия. Решение можно найти здесь, и именно так мне пришлось сделать это для моего реального проекта в конце: stackoverflow.com/questions/15382728/   -  person GuidoT    schedule 22.04.2021