2013-04-15 11 views
9

Mam folder wypełniony plików TTF czcionek niestandardowych. Muszę zainstalować je jako czcionki systemowe za pomocą skryptu powershell (jest to w systemie Windows Server 2008 R2). Czy ktoś wie, jak to zrobić w grze powershell? Dzięki!Instalacja czcionki systemowej z PowerShell

Odpowiedz

15

Jest to dość proste. Spójrz na poniższym fragmencie:

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

I nie powinny wymagać, aby ponownie uruchomić/wylogowanie ...

Wartość 0x14 jest CLSID specjalnego folderu.

Ponadto Właśnie znalazłem ten samouczek wyjaśniający każdy krok powyżej:

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

+0

Dzięki! Wypróbuję to. Co oznacza 0x14? Czy to jest wartość przestrzeni nazw czcionek? – carlbenson

+1

Tak, zredagowałem kod z odpowiedzią i linkiem, proszę to sprawdzić. – gustavodidomenico

+0

Działa idealnie. Dziękuję Ci! – carlbenson

2

prostu chciałem pisać alternatywę, która nie wymaga 0x14 być zakodowana w skrypcie. Przekazać obiekt pliku do funkcji, a to po prostu uruchomić „Install” na podstawie której plik jest:

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' nie działa ze mną, tylko w trybie interaktywnym. Jakiekolwiek warunki wstępne? – VillasV

0

Używanie obiektu Shell.Application COM nie działa na Server Core (przynajmniej nie na 2012 R2).

miałem sukces, po prostu kopiując plik czcionki do C:\Windows\Fonts (w tym przypadku times.ttf), a następnie dodanie odpowiedniego wpisu do rejestru za pomocą PowerShell:

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

usunięcie jest odwrotnością instalacji. Jedynym minusem jest to, że ponowne uruchomienie jest wymagane zarówno po zainstalowaniu czcionki, jak i przed jej odinstalowaniem, jeśli aplikacja odwołuje się do niej.

kod
0

Shell został znany nie na zdalne i zbudować agentów - jeśli comobjects wykorzystujące powłokę zawodzą i są lustracji poprzez zdalny lub zbudować agentów następnie trzeba będzie użyć klas ramowe to zrobić (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

Shellcode jest znana na niepowodzenie na zdalne i zbudować agentów - jeśli comobjects wykorzystujące powłokę zawodzą i są lustracji poprzez zdalny lub zbudować agentów następnie trzeba będzie użyć klas ramowe to zrobić - Numer: http: // www .codewrecks.com/blog/index.php/2016/05/27/uniknąć wykorzystujących-shell-Command-in-PowerShell scipts/ – Derrick

+2

należy dodać pewne wyjaśnienie –

+0

zobaczyć link i dostarczone w moim poprzednim komentarzu - ma wszystko musisz wiedzieć – Derrick