powershell安装字体

参考  Install-Fonts (powershellweekly.com)   从命令行获取TTF文件的实际字体名称。 windows command-line cmd.exe fonts - Dev59

使用 -File 开关 Install-Fonts -File “c:\Fonts\FontName.ttf”选择一个文件
使用 -Files 开关安装字体 -Files “c:\Fonts” 选择整个文件夹
 
复制代码
<#
.Synopsis
   Install-Fonts
   Author: Michael J. Thomas
   Created: 07/10/2019
   Updated: 07/10/2019
.DESCRIPTION
   Install Fonts on a computer.
.EXAMPLE
   Install-Fonts -Files "C:\Fonts"
.EXAMPLE
   Install-Fonts -File "C:\Fonts\LeanStatus.ttf"
#>
function Install-Fonts
{
    [CmdletBinding()]
    Param
    (
        [string[]]$Files,
        [string]$File
    )

    $objShell = New-Object -ComObject Shell.Application
    $Fonts = $objShell.NameSpace(20)
    If (!($Files -eq $null)){  Get-ChildItem "$Files\*.ttf" | ForEach-Object {$Fonts.CopyHere($_.FullName)} }
    ElseIf (!($File -eq $null)){ $Fonts.CopyHere($File) }
  
}
复制代码

这个是为当前用户安装,如果要给所有用户安装, 参考 使用 PowerShell | 安装字体烷烃 (alkanesolutions.co.uk)

本质是

将字体复制到:

C:\Windows\Fonts

并在其中注册一个条目:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\Fonts

 

 

 

 

以下实测正常,遍历当前文件夹内所有字体文件并添加

 

function Install-Font {  
param  
(  
    [System.IO.FileInfo]$fontFile  
)  
      
    try { 

        #添加程序集
        Add-Type -AssemblyName PresentationCore
        # $gt = [Windows.Media.GlyphTypeface]::new($fontFile.FullName) 作废
        #get font name 获取字体名称
        $gt = New-Object -TypeName Windows.Media.GlyphTypeface -ArgumentList $fontFile.FullName
        $family = $gt.Win32FamilyNames['zh-CN']
        if ($null -eq $family) { $family = $gt.Win32FamilyNames.Values.Item(0) }
        $face = $gt.Win32FaceNames['zh-CN']
        if ($null -eq $face) { $face = $gt.Win32FaceNames.Values.Item(0) }
        $fontName = ("$family $face").Trim() 
           
        switch ($fontFile.Extension) {  
            ".ttf" {$fontName = "$fontName (TrueType)"}  
            ".otf" {$fontName = "$fontName (OpenType)"}  
                                      }  

        write-host "Installing font: $fontFile with font name '$fontName'"

        If (!(Test-Path ("$($env:windir)\Fonts\" + $fontFile.Name))) {  
            write-host "Copying font: $fontFile"
            Copy-Item -Path $fontFile.FullName -Destination ("$($env:windir)\Fonts\" + $fontFile.Name) -Force 
            } 
            else {  write-host "Font already exists: $fontFile" }

        If (!(Get-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -ErrorAction SilentlyContinue)) {  
            write-host "Registering font: $fontFile"
            New-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value $fontFile.Name -Force -ErrorAction SilentlyContinue | Out-Null  
            } 
            else {  write-host  -ForegroundColor:Green "Font already registered: $fontFile" }
           
              
             
         }
         catch {            
                write-host "Error installing font: $fontFile. " $_.exception.message
                }
    
} 
 

function Uninstall-Font {  
param  
(  
    [System.IO.FileInfo]$fontFile  
)  
      
    try { 

        #get font name 获取字体名称
        Add-Type -AssemblyName PresentationCore
        $gt = New-Object -TypeName Windows.Media.GlyphTypeface -ArgumentList $fontFile.FullNam
        $family = $gt.Win32FamilyNames['zh-CN']
        if ($null -eq $family) { $family = $gt.Win32FamilyNames.Values.Item(0) }
        $face = $gt.Win32FaceNames['zh-CN']
        if ($null -eq $face) { $face = $gt.Win32FaceNames.Values.Item(0) }
        $fontName = ("$family $face").Trim()
           
        switch ($fontFile.Extension) {  
            ".ttf" {$fontName = "$fontName (TrueType)"}  
            ".otf" {$fontName = "$fontName (OpenType)"}  
            }  

        write-host "Uninstalling font: $fontFile with font name '$fontName'"

        If (Test-Path ("$($env:windir)\Fonts\" + $fontFile.Name)) {  
            write-host "Removing font: $fontFile"
            Remove-Item -Path "$($env:windir)\Fonts\$($fontFile.Name)" -Force 
            }
            else {  write-host "Font does not exist: $fontFile" }

        If (Get-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -ErrorAction SilentlyContinue) {  
            write-host "Unregistering font: $fontFile"
            Remove-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -Force                      
            } 
            else {  write-host "Font not registered: $fontFile" }
           
             
             
        } 
        catch {            
        write-host "Error uninstalling font: $fontFile. " $_.exception.message
            }        
}  
  


#Loop through fonts in the same directory as the script and install/uninstall them   遍历当前文件夹内所有字体文件并安装



foreach ( $FontItem in ( ls -Recurse | Where-Object {($_.Name -like '*.ttf') -or ($_.Name -like '*.otf')}  ) )
{  
    Install-Font -fontFile $FontItem.FullName  
}
 

 

 

作废

 

复制代码
以下作废

function Install-Font { param ( [System.IO.FileInfo]$fontFile ) try { #get font name $gt = [Windows.Media.GlyphTypeface]::new($fontFile.FullName) $family = $gt.Win32FamilyNames['en-us'] if ($null -eq $family) { $family = $gt.Win32FamilyNames.Values.Item(0) } $face = $gt.Win32FaceNames['en-us'] if ($null -eq $face) { $face = $gt.Win32FaceNames.Values.Item(0) } $fontName = ("$family $face").Trim() switch ($fontFile.Extension) { ".ttf" {$fontName = "$fontName (TrueType)"} ".otf" {$fontName = "$fontName (OpenType)"} } write-host "Installing font: $fontFile with font name '$fontName'" If (!(Test-Path ("$($env:windir)\Fonts\" + $fontFile.Name))) { write-host "Copying font: $fontFile" Copy-Item -Path $fontFile.FullName -Destination ("$($env:windir)\Fonts\" + $fontFile.Name) -Force } else { write-host "Font already exists: $fontFile" } If (!(Get-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -ErrorAction SilentlyContinue)) { write-host "Registering font: $fontFile" New-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value $fontFile.Name -Force -ErrorAction SilentlyContinue | Out-Null } else { write-host "Font already registered: $fontFile" } [System.Runtime.Interopservices.Marshal]::ReleaseComObject($oShell) | out-null Remove-Variable oShell } catch { write-host "Error installing font: $fontFile. " $_.exception.message } } function Uninstall-Font { param ( [System.IO.FileInfo]$fontFile ) try { #get font name $gt = [Windows.Media.GlyphTypeface]::new($fontFile.FullName) $family = $gt.Win32FamilyNames['en-us'] if ($null -eq $family) { $family = $gt.Win32FamilyNames.Values.Item(0) } $face = $gt.Win32FaceNames['en-us'] if ($null -eq $face) { $face = $gt.Win32FaceNames.Values.Item(0) } $fontName = ("$family $face").Trim() switch ($fontFile.Extension) { ".ttf" {$fontName = "$fontName (TrueType)"} ".otf" {$fontName = "$fontName (OpenType)"} } write-host "Uninstalling font: $fontFile with font name '$fontName'" If (Test-Path ("$($env:windir)\Fonts\" + $fontFile.Name)) { write-host "Removing font: $fontFile" Remove-Item -Path "$($env:windir)\Fonts\$($fontFile.Name)" -Force } else { write-host "Font does not exist: $fontFile" } If (Get-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -ErrorAction SilentlyContinue) { write-host "Unregistering font: $fontFile" Remove-ItemProperty -Name $fontName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -Force } else { write-host "Font not registered: $fontFile" } [System.Runtime.Interopservices.Marshal]::ReleaseComObject($oShell) | out-null Remove-Variable oShell } catch { write-host "Error uninstalling font: $fontFile. " $_.exception.message } } $currentDirectory = [System.AppDomain]::CurrentDomain.BaseDirectory.TrimEnd('\') if ($currentDirectory -eq $PSHOME.TrimEnd('\')) { $currentDirectory = $PSScriptRoot } #Loop through fonts in the same directory as the script and install/uninstall them foreach ($FontItem in (Get-ChildItem -Path $currentDirectory | Where-Object {($_.Name -like '*.ttf') -or ($_.Name -like '*.otf') })) { Install-Font -fontFile $FontItem.FullName }
















复制代码
posted @   kyo413  阅读(871)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2021-01-11 windev 学习补丁
点击右上角即可分享
微信分享提示