windows 用于安装字体系列的Powershell脚本

bn31dyow  于 12个月前  发布在  Windows
关注(0)|答案(4)|浏览(258)

下面是我的脚本istalling Monserrat字体从zip文件.我不知道如何检查字体是否已经安装.安装后,我可以打开文件夹C:\Windows\Fonts\Montserrat,我看到他们的人.当我运行脚本第二次,它是不承认这个文件夹的存在.我的错误在哪里?

$Source = "Montserrat.zip"
$FontsFolder = "FontMontserrat"
Expand-Archive $Source -DestinationPath $FontsFolder
$FONTS = 0x14
$CopyOptions = 4 + 16;
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.Namespace($FONTS)
$allFonts = dir $FontsFolder
foreach($File in $allFonts)
{
    If((Test-Path "C:\Windows\Fonts\Montserrat") -eq $True)
    {
        echo "Font $File already installed"
    }
    Else
    {
        echo "Installing $File"
        $CopyFlag = [String]::Format("{0:x}", $CopyOptions);
        $objFolder.CopyHere($File.fullname,$CopyFlag)
    }
}

字符串

pnwntuvh

pnwntuvh1#

最后是我的剧本:

$Source = "Montserrat.zip"
$FontsFolder = "FontMontserrat"
Expand-Archive $Source -DestinationPath $FontsFolder -Force
$FONTS = 0x14
$CopyOptions = 4 + 16;
$objShell = New-Object -ComObject Shell.Application
$objFolder = $objShell.Namespace($FONTS)
$allFonts = dir $FontsFolder
foreach($font in Get-ChildItem -Path $fontsFolder -File)
{
    $dest = "C:\Windows\Fonts\$font"
    If(Test-Path -Path $dest)
    {
        echo "Font $font already installed"
    }
    Else
    {
        echo "Installing $font"
        $CopyFlag = [String]::Format("{0:x}", $CopyOptions);
        $objFolder.CopyHere($font.fullname,$CopyFlag)
    }
}

字符串
我通过以下命令运行此脚本:

set batchPath=%~dp0
powershell.exe -noexit -file "%batchPath%InstMontserrat.ps1"


我不需要以管理员身份运行它,但用户有管理员权限。

zpqajqem

zpqajqem2#

我将分享我使用的脚本。首先需要执行一些步骤。注意:此脚本已在Dev中测试,部署到Pilot,然后在我们的环境中部署到Prod。
1.我把所有的.ttf文件复制到同一个目录中(而不是大部分字体所在的子文件夹)。
1.将“Install-Font.ps1”保存到与字体相同的目录中。
1.要在本地测试,请执行以下操作:
1.打开PowerShell(作为管理员)并将CD放入字体文件夹。
1.运行脚本以加载Install-Font函数

  1. PS C:\Temp\SoftwareDeploy\Fonts> .\Install-Font.ps1
  2. PS C:\Temp\SoftwareDeploy\Fonts> Install-Font
function Install-Font {
 param (
     [System.IO.FileInfo]$fontFile
 )
 try {
     $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)"}
     }

     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
         write-host "Fonts have been copied into the Fonts directory"
     } 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
         Write-Host "Fonts have been registered successfully"
     } else {
         write-host "Font already registered: $fontFile"
     }

     } catch {
         write-host "Error installing font: $fontFile. " $_.exception.message
     }
 }

 $FontItems = Get-ChildItem -Path $PSScriptRoot | Where-Object {($_.Name -like '*.ttf')}

 foreach ($FontItem in $FontItems) {
     Install-Font -fontFile $FontItem.FullName
 }

字符串

4ioopgfo

4ioopgfo3#

基于我的评论 * 假设Windows 10* 更正您的脚本:

# well-known SID for admin group
if ('S-1-5-32-544' -notin [System.Security.Principal.WindowsIdentity]::GetCurrent().Groups) {
    throw 'Script must run as admin!'
}

$source = 'Montserrat.zip'
$fontsFolder = 'FontMontserrat'

Expand-Archive -Path $source -DestinationPath $fontsFolder

foreach ($font in Get-ChildItem -Path $fontsFolder -File) {
    $dest = "C:\Windows\Fonts\$font"
    if (Test-Path -Path $dest) {
        "Font $font already installed."
    }
    else {
        $font | Copy-Item -Destination $dest
    }
}

字符串

5f0d552i

5f0d552i4#

如果您不想在操作系统级别上安装字体,而只是让程序在重新启动之前使用它,您可能需要使用以下脚本:

  • 如果无法注册/取消注册字体,将失败/抛出。
  • 广播WM_FONTCHANGE以通知所有窗口字体已更改
  • 不需要管理员权限
  • 在Windows中不安装字体,仅在重新启动之前使字体可用于当前会话中的所有程序
  • 具有用于调试的详细模式
  • 不适用于字体文件夹

使用方法:

register-fonts.ps1 [-v] [-unregister <PATH>[,<PATH>...]] [-register  <PATH>[,<PATH>...]] # Register and unregister at same time
register-fonts.ps1 [-v] -unregister <PATH>
register-fonts.ps1 [-v] -register <PATH>
register-fonts.ps1 [-v] <PATH> # Will register font path

个字符
剧本的灵感来自于这个要点https://gist.github.com/Jaykul/d53a16ce5e7d50b13530acb4f98aaabd

相关问题