2013-04-15 122 views
9

我有一個文件夾充滿自定義字體的TTF文件。我需要使用powershell腳本(這是在Windows Server 2008 R2上)將它們安裝爲系統字體。有誰知道如何在PowerShell中做到這一點? 謝謝!使用Powershell安裝系統字體

回答

15

這很簡單。看看下面的代碼片段:

$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

+0

謝謝!我會測試一下。 0x14表示什麼?那是字體命名空間的價值嗎? – carlbenson

+1

是的,我編輯的代碼與答案和鏈接,請檢查出來。 – gustavodidomenico

+0

完美的作品。謝謝! – carlbenson

2

只是想後不需要0x14被硬編碼到腳本的替代品。將文件對象傳遞給函數,它將只運行基於「安裝」裏的文件是:

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") 
    } 
} 
+0

'$ shell = New-Object -ComObject Shell.Application'只在交互模式下不適用於我。任何先決條件? – VillasV

0

使用Shell.Application COM對象的服務器核心(至少不會在2012 R2不起作用)。

我不得不簡單地複製字體文件到C:\Windows\Fonts(在這種情況下TIMES.TTF),然後添加使用PowerShell相應註冊表項的成功:

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

切除是安裝相反。唯一的缺點是在安裝字體之後以及在應用程序引用它之前還需要重新啓動時才需要重新啓動。

0

shell代碼已經知道失敗的遠程和生成代理 - 如果使用shell的comobjects是失敗,你是通過遠程審批或生成代理,那麼你將需要使用框架類來完成這一(reference

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

已知Shell代碼在Remote和Build代理上失敗 - 如果使用shell的comobjects失敗並且您正在通過Remote或Build代理進行審查,那麼您將需要使用框架類來執行此操作 - ref:http:// www .codewrecks.com/blog/index.php/ 2016/05/27/avoid-using-shell-command-in-powershell-scipts/ – Derrick

+2

請添加一些解釋 –

+0

請參閱我在上次評論中提供的鏈接 - 它包含所有內容你得知道 – Derrick