2013-04-15 10 views
9

Ich habe einen Ordner mit TTF-Dateien von benutzerdefinierten Schriftarten gefüllt. Ich muss sie als Systemschriftarten mit einem Powershell-Skript installieren (das ist unter Windows Server 2008 R2). Weiß jemand, wie man das in Powershell macht? Danke!Installieren der Systemschrift mit Powershell

Antwort

15

Es ist ziemlich einfach. Werfen Sie einen Blick auf das Snippet unten:

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

Und es sollte nicht neu zu starten, benötigen/Abmelde ...

Der 0x14 Wert der CLSID des speziellen Ordner ist.

Außerdem fand ich gerade dieses Tutorial jeden Schritt oben erklärt:

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

+0

Danke! Ich werde es ausprobieren. Was bedeutet 0x14? Ist das der Wert des Namespace für Schriftarten? – carlbenson

+1

Ja, ich habe den Code mit der Antwort und einem Link bearbeitet, bitte überprüfen Sie es. – gustavodidomenico

+0

Funktioniert perfekt. Vielen Dank! – carlbenson

2

Ich wollte nur eine Alternative schreiben, die nicht 0x14 erfordert hart in das Skript kodiert werden. Übergeben Sie das Dateiobjekt an die Funktion, und es läuft nur auf „Install“, basierend auf dem die Datei ist:

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' funktioniert nicht mit mir, nur im interaktiven Modus. Jede Voraussetzung? – VillasV

0

Mit dem Shell.Application COM-Objekt nicht auf Server Core funktioniert (zumindest nicht auf 2012 R2).

hatte ich Erfolg durch einfaches Kopieren der Schriftdatei zu C:\Windows\Fonts (in diesem Fall times.ttf) und dann die entsprechenden Registrierungseintrag mit Powershell:

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

Entfernen ist die Umkehrung der Installation. Der einzige Nachteil ist, dass ein Neustart erforderlich ist, sowohl nachdem die Schriftart installiert wurde als auch bevor sie deinstalliert wird, wenn eine Anwendung darauf verwiesen hat.

0

Shell Code ist bekannt, auf Fern zum Scheitern verurteilt und Agenten zu bauen - wenn die comobjects-Shell versagen und Sie vetting über Remote oder Agenten bauen, dann müssen Sie die Framework-Klassen verwenden, um diese (reference)

zu tun
## 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

Es ist bekannt, dass Shell-Code auf Remote- und Build-Agenten fehlschlägt - wenn die comobjects, die Shell verwenden, fehlschlagen und Sie über Remote- oder Build-Agenten überprüfen, müssen Sie dafür die Framework-Klassen verwenden - ref: http: // www .codewrecks.com/blog/index.php/2016/05/27/vermeide-benutze-shell-befehl-in-powershell-scripts/ – Derrick

+2

bitte fügen sie eine erklärung hinzu –

+0

siehe den link ich in meinem letzten kommentar zur verfügung gestellt - es hat alles du musst wissen – Derrick

Verwandte Themen