首页 > 解决方案 > 使用 PowerShell 安装字体 - 跳过已安装的字体

问题描述

我需要一个脚本让我的客户在网络上搜索共享并安装字体。我已经在社区的支持下创建了一个脚本。那行得通,但它一直在尝试安装已经安装的字体。这会导致问题,因为会弹出一个框询问您是否要覆盖。使用 1000 多种字体会导致一些问题。

客户需要在所有计算机上安装所有字体,因为它需要在几台计算机上设计打印,然后使用其他计算机打印。

标签: powershellfontsscripting

解决方案


在搜索网络并将脚本连接在一起后,我设法让它工作。所以我想我会分享。如果它帮助了我,它可能会帮助其他人。

我永远不会称自己为编码员,因此其他人可能会找到更好的方法来做到这一点。但是使用脚本,它将查看您在 $Path= 上选择的位置,然后检查 C:\Users$username\AppData\Local\Microsoft\Windows\Fonts 是否已安装任何位置。它还将仅安装 .fon .otf .ttc 和 .ttf 文件。我需要这一点,因为即使被告知不要,用户也倾向于在此位置放置一些图像。

$FONTS = 0x14
$Path="\\NAS LOCATION\Fonts"
$FontItem = Get-Item -Path $Path
$FontList = Get-ChildItem -Path "$FontItem\*" -Include ('*.fon','*.otf','*.ttc','*.ttf')
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.Namespace($FONTS)
$Fontdir = dir $Path
$username = $env:UserName
  
foreach($File in $FontList) {
    if(!($file.name -match "pfb$"))
    {
        $try = $true
        $installedFonts = @(Get-ChildItem C:\Users\$username\AppData\Local\Microsoft\Windows\Fonts | Where-Object {$_.PSIsContainer -eq $false} | Select-Object basename)
        $name = $File.baseName
    
        foreach($font in $installedFonts)
        {
            $font = $font -replace "_", ""
            $name = $name -replace "_", ""
            if ($font -match $name)
            {
                $try = $false
            }
        }
        if ($try)
        {
            $objFolder.CopyHere($File.fullname)
        }
    }
}

学分归于以下人员/帖子。乔丹马尔科姆 - https://jordanmalcolm.com/deploying-windows-10-fonts-at-scale/ CloudCompanyApps - https://cloudcompanyapps.com/2019/06/06/install-windows-fonts-with-powershell/


推荐阅读