Система создания новых объектов в Windows 7 / PS2.0.Drawing.Text.PrivateFontCollection не работает, но работает в Windows 10

#powershell

#powershell

Вопрос:

Я успешно использовал это в Windows 10, и оно сообщает название семейства шрифтов, как и ожидалось.

 $fontFile = '\pxRolloutsMiscFontsArial NarrowARIALN.TTF'
$fontCol = [System.Drawing.Text.PrivateFontCollection]::new()
$fontCol.AddFontFile($fontFile)
Write-Host "$($fontCol.Families.Name)"
  

Однако, когда я переключаюсь на использование New-Object для поддержки Windows 7 / PS2, вот так

 $fontFile = '\pxRolloutsMiscFontsArial NarrowARIALN.TTF'
$fontCol = New-Object System.Drawing.Text.PrivateFontCollection
$fontCol.AddFontFile($fontFile)
Write-Host "$($fontCol.Families.Name)"
  

Это работает только в Windows 10. В Windows 7 я не получаю сообщение об ошибке, но я также не получаю название семейства шрифтов.

Но в документации Microsoft предполагается, что класс доступен вплоть до .NET Framework 1.1. И свойство Families задокументировано как возвращающееся к нему также. Итак, я что-то делаю неправильно или где-то отсутствуют какие-то доказательства того, что это не работает в Ps2.0 или …?

Интересно, что ‘$fontCol.Families’ показывает, что свойство Name существует и заполнено правильно. Итак, кажется, мне нужно получить к нему другой доступ для Windows 7?

Комментарии:

1. Перечисление свойств было введено в 3.0, поэтому $anArray.MemberNameOfArrayItems не будет работать в 2.0. Write-Host "$($fontCol.Families|%{$_.Name})" должно работать, то же самое с Write-Host "$($fontCol.Families[0].Name)"

2. Это маленькая деталь, которую я упустил!

3. Всегда есть что-то ^_^

Ответ №1:

Хотя это может быть легко не заметить, в вашем коде фактически используется функция, которая была представлена только в Windows PowerShell 3.0, а именно перечисление свойств!

$fontCol.Families это перечислимая коллекция, поэтому, когда вы это делаете $fontCol.Families.Name в PowerShell 5.1 в Windows 10, PowerShell выдает сообщение « $fontCol.Families этого свойства нет, но давайте я попробую перечислить элементы в коллекции и вместо этого определить Name значение этих«.

Но в PowerShell 2.0 механизм выполнения просто сообщает «у коллекции нет Name свойства», и выражение принимает значение $null .

Учитывая, что вы импортируете только 1 шрифт в вашем примере, вы можете сделать:

 $fontCol.Families[0].Name
  

Или, если вы хотите поддерживать несколько шрифтов в коллекции одновременно, вручную перечислите коллекцию:

 $fontCol.Families |ForEach-Object {$_.Name}