2013-04-15 3 views

risposta

15

È abbastanza semplice. Date un'occhiata sul frammento di seguito:

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

E non dovrebbe richiedere il riavvio/logoff ...

Il valore 0x14 è il CLSID della cartella speciale.

Inoltre ho appena trovato questo tutorial che spiega ogni passo sopra:

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

+0

Grazie! Lo proverò. Cosa significa 0x14? È il valore dello spazio dei nomi dei caratteri? – carlbenson

+1

Sì, ho modificato il codice con la risposta e un collegamento, si prega di controllare. – gustavodidomenico

+0

Funziona perfettamente. Grazie! – carlbenson

2

Proprio voluto pubblicare un'alternativa che non richiede 0x14 da codificare duro nello script. Passare l'oggetto file alla funzione, e sarà solo eseguire "Install" in base a dove il file è:

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' non funziona con me, solo in modalità interattiva. Qualche prerequisito? – VillasV

0

Utilizzando l'oggetto COM Shell.Application non funziona su Server Core (almeno non nel 2012 R2).

ho avuto successo semplicemente copiando il file di font da C:\Windows\Fonts (in questo caso times.ttf) e poi aggiungere la voce del Registro corrispondente con PowerShell:

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

La rimozione è l'inverso. L'unico svantaggio è che è necessario un riavvio sia dopo che il font è stato installato e anche prima che venga disinstallato se un'applicazione lo ha fatto riferimento.

codice
0

Shell è stato conosciuto a fallire sul remoto e costruire agenti - se i comobjects utilizzando guscio stanno fallendo e si vagliare tramite remoto o costruire agenti allora si avrà bisogno di utilizzare le classi del framework per fare questo (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

È noto che il codice shell non funziona con gli agenti Remote e Build: se i comobjects che utilizzano la shell non funzionano e si sta controllando tramite agenti Remote o Build, sarà necessario utilizzare le classi framework per fare ciò: ref: http: // www .codewrecks.com/blog/index.php/2016/05/27/avoid-using-shell-command-in-powershell-scipts/ – Derrick

+2

per favore aggiungi qualche spiegazione –

+0

vedi il link che ho fornito nel mio ultimo commento - ha tutto devi sapere – Derrick