#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}