Определить точное имя шрифта OpenType в PowerShell - PullRequest
0 голосов
/ 23 мая 2018

У меня есть коллекция файлов шрифтов OpenType, которые являются различными стилями одного и того же семейства:

  • "FreigSanLFProBol.otf" (FreightSansLFPro Bold)
  • "FreigSanLFProBoo.otf"(FreightSansLFPro Regular)
  • "FreigSanLFProBooIta.otf" (FreightSansLFPro Italic)

Чтобы установить эти шрифты через PowerShell и правильно добавить их в реестр, мне нужно знать их дружественныеимя стиля.

Когда я устанавливаю «FreigSanLFProBol.otf» через проводник Windows, раздел реестра содержит следующие данные:

{
  name: "FreightSansLFPro Bold (TrueType)",
  type: REG_SZ,
  data: "FreigSanLFProBol.otf"
}

Проблема в том, что я не знаю, как программно определить значениев ключе "name" из самого файла шрифта.

Используя информацию, доступную в Название шрифта от powershell , я смог получить большую часть пути:

$path = "C:\Windows\Fonts\FreigSanLFProBol.otf"
Add-Type -AssemblyName System.Drawing
$fontCollection = New-Object System.Drawing.Text.PrivateFontCollection
$fontCollection.AddFontFile($(Get-Item $path).fullname)
$fontCollection.Families[-1].Name

Это дает мне результат "FreightSansLFPro "- отличается от значения ключа reg, которое дает его как" FreightSansLFPro Bold ".(Не берите в голову тот факт, что ключ reg по-прежнему перечисляет тип как «TrueType Font», даже если это шрифт OpenType).

Откуда он получает «Bold» и как получить это конкретное значение /название из файла шрифта программно?

1 Ответ

0 голосов
/ 23 мая 2018
$folder = "C:\Windows\fonts\"

$objShell = New-Object -ComObject Shell.Application 


$fileList = @() 
$attrList = @{} 
$details = ( "Title",
              "Font style",
              "Show/hide", 
              "Designed for",
              "Category",
              "Designer/foundry" ,
               "Font Embeddability",
               "Font type",
               "Family",
               "Date created",
               "Date modified",
               "Collection",
               "Font file names",
               "Font version"
                 ) 

 #figure out what the possible metadata is
$objFolder = $objShell.namespace($folder) 
for ($attr = 0 ; $attr  -le 500; $attr++) 
{ 
    $attrName = $objFolder.getDetailsOf($objFolder.items, $attr) 
    if ( $attrName -and ( -not $attrList.Contains($attrName) )) 
    {  
        $attrList.add( $attrName, $attr )  
    } 
} 

 #$attrList

 #loop through all the fonts, and process
     $objFolder = $objShell.namespace($folder) 
    foreach($file in $objFolder.items()) 
    { 
        foreach( $attr in $details) 
        { 

            $attrValue = $objFolder.getDetailsOf($file, $attrList[$attr]) 
            if ( $attrValue )  
            {  
                Add-Member -InputObject $file -MemberType NoteProperty -Name $attr -value $attrValue 
            }  
        } 
        $fileList += $file 
        write-verbose "Prcessing file number $($fileList.Count)"
    } 


$fileList | select $details |  out-gridview

Источник: https://powershell.org/forums/topic/listing-font-details/

...