簡體   English   中英

無法在 Windows 10 上安裝 fonts 和 Powershell

[英]Cannot install fonts with Powershell on Windows 10

在我的工作計算機上,我沒有管理員權限。

安裝新的 fonts 不是“簡單的方法”。

At the time I was using Windows 7, I managed to run a PowerShell script that was launched at session startup and that installed the fonts from a given folder.

這是我使用的代碼:

add-type -name Session -namespace "" -member @"
[DllImport("gdi32.dll")]
public static extern int AddFontResource(string filePath);
"@

$FontFolder = "C:\Users\myusername\Documents\Fonts"

$null = foreach($font in Get-ChildItem -Path $FontFolder -Recurse -Include *.ttf, *.otg, *.otf) {
    Write-Host "Installing : $($font.FullName)"
    $result = [Session]::AddFontResource($font.FullName)
    Write-Host "Installed $($result) fonts"
}

Now that I have switched to Windows 10, I thought I could go back to installing fonts "the easy way", as it is supposed to be possible to install fonts for your user without admin privileges.

然而這仍然不起作用:彈出 window 說“請求的文件不是有效的字體文件”。 一種解決方案顯然是啟動 Windows 防火牆我的管理員當然不允許這樣做......但它已經在運行(請參閱下面的編輯)

然后回到 PowerShell。 不幸的是,該腳本不再起作用,並且沒有提供任何有趣的指向問題出處的指針:

Installing : C:\Users\myusername\Documents\Fonts\zilla-slab\ZillaSlab-SemiBold.otf
Installed 0 fonts
Installing : C:\Users\myusername\Documents\Fonts\zilla-slab\ZillaSlab-SemiBoldItalic.otf
Installed 0 fonts
Installing : C:\Users\myusername\Documents\Fonts\zilla-slab\ZillaSlabHighlight-Bold.otf
Installed 0 fonts

我嘗試使用 try catch,但仍然沒有發現錯誤:

add-type -name Session -namespace "" -member @"
[DllImport("gdi32.dll")]
public static extern int AddFontResource(string filePath);
"@

$FontFolder = "C:\Users\myusername\Documents\Fonts"

$null = foreach($font in Get-ChildItem -Path $FontFolder -Recurse -Include *.ttf, *.otg, *.otf) {
    try {
        Write-Host "Installing : $($font.FullName)"
        $result = [Session]::AddFontResource($font.FullName)
        Write-Host $result
    }
    catch {
        Write-Host "An error occured installing $($font)"
        Write-Host "$($error)"
        Write-Host "$($error[0].ToString())"
        Write-Host ""
        1
    }   
}

以及由此產生的 output

Installing : C:\Users\myusername\Documents\Fonts\zilla-slab\ZillaSlabHighlight-Bold.otf
0
Installing : C:\Users\myusername\Documents\Fonts\zilla-slab\ZillaSlabHighlight-Regular.otf
0
Installing : C:\Users\myusername\Documents\Fonts\ZillaSlab-Light.otf
0

知道如何解決這個問題嗎?

編輯:

關於安全應用程序的狀態,這里是 McAfee 狀態:

McAfee Data Exchange Layer OK 
McAfee DLP Endpoint OK 
Programme de mise à jour McAfee OK 
McAfee Endpoint Security OK 

“Programme de mise à jour”在法語中意為“更新程序”。

我還檢查了正在運行的服務列表:

  • mpssvc 服務(Windows Defender 防火牆)正在運行
  • mfefire(McAfee 防火牆核心服務)未運行

編輯2:

我的最后一次嘗試如下:

  • 我將字體文件手動復制到 $($env:LOCALAPPDATA)\Microsoft\Windows\Fonts\ 文件夾
  • 使用 regedit,我添加了如下所示的條目

在此處輸入圖像描述

我重新開始了。 WordPad 或 Publisher 中仍然沒有 Bebas 字體

這是我使用 com object 的方法。 這適用於我作為非管理員基於Install fonts without administratorprivilege 我可以在設置下的 Fonts 區域中看到 fonts 安裝到“$env:LOCALAPPDATA\Microsoft\Windows\Fonts”。 我有 Windows 10 20H2(它應該在 1803 或更高版本中工作)。 我還看到寫字板中安裝了 fonts。

$Destination = (New-Object -ComObject Shell.Application).Namespace(20)

$TempFolder = "$($env:windir)\Temp\Fonts\"

New-Item -Path $TempFolder -Type Directory -Force | Out-Null

Get-ChildItem -Path $PSScriptRoot\fonts\* -Include '*.ttf','*.ttc','*.otf' | 
  ForEach {
    If (-not(Test-Path "$($env:LOCALAPPDATA)\Microsoft\Windows\Fonts\$($_.Name)")) {

        $Font = "$($env:windir)\Temp\Fonts\$($_.Name)"

        Copy-Item  $($_.FullName) -Destination $TempFolder
        
        $Destination.CopyHere($Font)

        Remove-Item $Font -Force

    } else { "font $($env:LOCALAPPDATA)\Microsoft\Windows\Fonts\$($_.Name) already installed" }

}

REG_SZ 注冊表項示例:

dir 'HKCU:\Software\Microsoft\Windows NT\CurrentVersion\Fonts*' | ft -a


    Hive: HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion


Name  Property
----  --------
Fonts Nunito Black (TrueType) : C:\Users\myuser\AppData\Local\Microsoft\Windows\Fonts\Nunito-Black.ttf

您可以使用以下 powershell 腳本在 windows 上安裝 fonts。

param(
[Parameter(Mandatory=$true,Position=0)]
[ValidateNotNull()]
[array]$pcNames,
[Parameter(Mandatory=$true,Position=1)]
[ValidateNotNull()]
[string]$fontFolder
)
$padVal = 20
$pcLabel = "Connecting To".PadRight($padVal," ")
$installLabel = "Installing Font".PadRight($padVal," ")
$errorLabel = "Computer Unavailable".PadRight($padVal," ")
$openType = "(Open Type)"
$regPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
$objShell = New-Object -ComObject Shell.Application
if(!(Test-Path $fontFolder))
{
    Write-Warning "$fontFolder - Not Found"
}
else
{
    $objFolder = $objShell.namespace($fontFolder)
    foreach ($pcName in $pcNames)
    {
        Try{
            Write-Output "$pcLabel : $pcName"
            $null = Test-Connection $pcName -Count 1 -ErrorAction Stop
            $destination = "\\",$pcname,"\c$\Windows\Fonts" -join ""
            foreach ($file in $objFolder.items())
            {
                $fileType = $($objFolder.getDetailsOf($file, 2))
                if(($fileType -eq "OpenType font file") -or ($fileType -eq "TrueType font file"))
                {
                    $fontName = $($objFolder.getDetailsOf($File, 21))
                    $regKeyName = $fontName,$openType -join " "
                    $regKeyValue = $file.Name
                    Write-Output "$installLabel : $regKeyValue"
                    Copy-Item $file.Path  $destination
                    Invoke-Command -ComputerName $pcName -ScriptBlock { $null = New-ItemProperty -Path $args[0] -Name $args[1] -Value $args[2] -PropertyType String -Force } -ArgumentList $regPath,$regKeyname,$regKeyValue
                }
            }
        }
        catch{
            Write-Warning "$errorLabel : $pcName"
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM