Установка системного шрифта с помощью Powershell

У меня есть папка, заполненная файлами TTF пользовательских шрифтов. Мне нужно установить их как системные шрифты с помощью сценария powershell (это на Windows Server 2008 R2). Кто-нибудь знает, как это сделать в PowerShell? Спасибо!

4 ответов


Это довольно просто. Взгляните на фрагмент ниже:

$FONTS = 0x14
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.Namespace($FONTS)
$objFolder.CopyHere("C:\test\Myfont.ttf")

и он не должен требовать перезапуска / выхода из системы...

значение 0x14 является CLSID специальной папки.

кроме того, я только что нашел этот учебник, объясняя каждый шаг выше:

http://windowsitpro.com/scripting/trick-installing-fonts-vbscript-or-powershell-script


просто хотел опубликовать альтернативу, которая не требует 0x14 быть жестко закодированным в скрипт. Передайте объект file в функцию, и она просто запустит "Install" в зависимости от того, где находится файл:

Function Install-Font {
   Param (
      [Parameter(Mandatory=$true,ValueFromPipeline=$true)][System.IO.FileSystemInfo[]]$File
   )
   $shell = New-Object -ComObject Shell.Application
   $File | % {
      $Fonts = $shell.NameSpace($_.Directory.Name)
      $font = $Fonts.ParseName($_.Name)
      $font.InvokeVerb("Install")
   }
}

С помощью Shell.Application COM-объект не работает на ядре сервера (по крайней мере, не на 2012 R2).

у меня был успех, просто скопировав файл шрифта в C:\Windows\Fonts (в этом случае раз.ttf), а затем добавление соответствующей записи реестра с помощью PowerShell:

New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts' -Name 'Times New Roman (TrueType)' -PropertyType String -Value times.ttf

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


шелл-код был известен не на удаленных и агентов построений - если comobjects через оболочку не и вы проверки через пульт или агентов построения, то вам нужно использовать структуру классов для этого (ссылка)

## Add or Remove Font Files - only tested with TTF font files thus far
#<#
#=======================================================================================================
# ADD or REMOVE MULTIPLE FONT FILES [Using ComObjects]
#=======================================================================================================
# This code will install or uninstall a font using ComObject
# You Must Modify the following variables in order to work
# (A) $dirFiles                ==>  This is the source folder path that contains all of your font files
# (B) $InstallOrUninstall      ==>  $true = Install Font ...  $false = UnInstall Font
#=======================================================================================================
    # Define Working Variables
        $dirFiles = "C:\Temp\Fonts"
        $InstallOrUninstall = $false  # $true = Install = 1  ...or...  $false = UnInstall = 0
        $srcFontFiles = Get-ChildItem "$($dirFiles)\Fonts"
        $Fonts = (New-Object -ComObject Shell.Application).Namespace(0x14)
    # Copy each file into the Font Folder or Delete it - Depends on the $InstallOrUninstall variable setting
        ForEach($srcFontFile in $srcFontFiles) 
        {
            $srcFontFileName = $srcFontFile.name
            $srcFontFileFullPath = $srcFontFile.fullname
            $targFonts = "C:\Windows\Fonts$($srcFontFileName)"
            If (Test-Path $targFonts -PathType any) { Remove-Item $targFonts -Recurse -Force } # UnInstall Font
            If ((-not(Test-Path $targFonts -PathType container)) -and ($InstallOrUninstall -eq $true)) { $fonts.CopyHere($srcFontFileFullPath, 16) } # Install Font
        }
#>