Windows:从cmd/.bat文件安装字体

12

有人知道如何通过命令提示符在Windows上安装字体文件(.ttf、.TTF、.otf、.OTF等等)吗?

据我所知,需要将文本文件移动到正确的文件夹,然后还要创建一个注册表值。但我还没有找到一个被确认可以工作的方法。

注意:我使用的是Windows 8,这可能会有所不同。

另外说明一下:我正在尝试批量安装从MKV文件中提取的字体。(因此,这将是一个部分包含在更大的.bat文件中的函数,如果需要,我可以发布代码)


没有第三方工具是无法完成的(至少需要一个额外的DLL/EXE文件)。虽然您可以通过文件复制和修改注册表手动添加字体,但系统仍然不会意识到新字体的存在,需要重新启动系统。 - Jay
8个回答

7

maybe this is needed too:

reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /v "FontName (TrueType)" /t REG_SZ /d FontName.ttf /f

2
将文件复制到“%SYSTEMROOT%\Fonts”中,并且这适用于Windows 10。不需要PowerShell,只需以管理员权限运行这些命令。 - Twonky

6
你需要使用PowerShell或VB脚本。它们基本上重新使用了在Windows资源管理器中执行相同操作的shell组件,而且它们不需要重新启动计算机。
以下是一个安装目录中所有字体的PowerShell脚本,适用于Windows 8.1或更早版本: https://social.technet.microsoft.com/Forums/fr-FR/winserverpowershell/thread/fcc98ba5-6ce4-466b-a927-bb2cc3851b59 这是一段类似的 Windows 10(Windows Server 2019)脚本,也会更新 Windows 注册表:

https://social.technet.microsoft.com/Forums/en-US/0c94dcf5-b89d-42e5-a499-06313f46f88b/can-no-longer-install-fonts-via-script-in-windows-10-1809?forum=win10itprogeneral

此外,您需要以管理员模式运行该脚本。因此,如果 PowerShell 脚本是 InstallFonts.ps1,则批处理文件需要如下:

powershell -command "Set-ExecutionPolicy Unrestricted" 2>> err.out  
powershell .\InstallFonts.ps1 2>> err.out

任何PowerShell错误都会出现在与脚本相同的文件夹中的'err.out'中。

PowerShell脚本的哪个部分应该添加注册表键? - Twonky
@Twonky,我更新了我的答案,包括一个设置字体注册表键的PS脚本链接。这对于Windows 10或Windows Server 2019是必需的。 - Yoshi

5
当您安装字体时,它所做的只是将.ttf文件复制到%systemroot%\fonts并在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts中添加一个条目。您可以使用以下批处理文件自动完成此操作。
Rem fontinst.bat

copy akbar.ttf %systemroot%\fonts

regedit /s font.reg
< p > font.reg 文件应包含以下内容:

REGEDIT4

\[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts\]

"Akbar Plain (TrueType)"="akbar.ttf"

Source: m.windowsitpro.com


4

我和一位同事找到了一个 PowerShell 解决方案,不需要管理员权限,也不会显示任何提示。您可以使用字体文件的名称来安装 并且 卸载它。这使得它在脚本编写中特别有用。

安装:

# Install-Font.ps1
param($file)

$signature = @'
[DllImport("gdi32.dll")]
 public static extern int AddFontResource(string lpszFilename);
'@

$type = Add-Type -MemberDefinition $signature `
    -Name FontUtils -Namespace AddFontResource `
    -Using System.Text -PassThru
   
$type::AddFontResource($file)

卸载:

# Uninstall-Font.ps1
param($file)

$signature = @'
[DllImport("gdi32.dll")]
public static extern bool RemoveFontResource(string lpszFilename);
'@

$type = Add-Type -MemberDefinition $signature `
    -Name FontUtils -Namespace RemoveFontResource `
    -Using System.Text -PassThru
   
$type::RemoveFontResource($file)

你可以在cmd或powershell中这样使用它们:

> powershell -executionpolicy bypass -File .\Install-Font.ps1 .\myfonts\playfair-display-v22-latin-regular.ttf
> powershell -executionpolicy bypass -File .\Uninstall-Font.ps1 .\myfonts\playfair-display-v22-latin-regular.ttf

该解决方案基于 https://www.leeholmes.com/powershell-pinvoke-walkthrough/,并使用本机 Win32 函数(gdi32.dll)。https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-addfontresourcew

谢谢!这非常有用,特别是当你想从CI/CD脚本安装字体时。干得好! - Bowo
1
你应该知道AddFontResource并不是在安装字体,而是在会话期间注册它以供使用,这意味着在重新启动后字体将不再存在。在某些情况下,这是需要的,但并非所有情况都是如此。已安装的字体需要位于特殊的系统文件夹(Windows/Fonts或用户字体文件夹)中,并且在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts(或用户等效项)中具有注册表键。 - Aalex Gabi
如果字体名称是非拉丁文,则此方法无法正常工作。 - user206904
1
这是我找到的唯一有效的方式。感谢你拯救了我的一天! - Max

1
如果你是Python爱好者,下面的脚本可以帮助你完成工作。该脚本会生成一个VBScript用于字体安装。它会搜索所有子文件夹中的TTF字体并进行安装。你不需要移动任何字体文件。
    import os
    import subprocess
    import time
    
    # vb script template
    _TEMPL  = """ 
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace("%s")
    Set objFolderItem = objFolder.ParseName("%s")
    objFolderItem.InvokeVerb("Install")
    """
    
    
    vbspath = os.path.join(os.getcwd(), 'fontinst.vbs')
    
    for directory, dirnames, filenames in os.walk(os.getcwd()):
        for filename in filenames:
            fpath = os.path.join(directory, filename)
    
            if fpath[-4:] == ".ttf": # modify this line for including multiple extension
                with open(vbspath, 'w') as _f:
                    _f.write(_TEMPL%(directory, filename))
                subprocess.call(['cscript.exe', vbspath])
                time.sleep(3) # can omit this
                    
     os.remove(vbspath)  # clean

在根目录下运行这个Python脚本


那段代码可能不够。Windows Shell动词字符串取决于Windows的本地化版本。 - Andry

1

你尝试将它们复制到字体文件夹中了吗?

copy font.ttf %windir%\Fonts

我尝试了上述命令,但在Windows10中它对我没有起作用。 - Deepp

1
我用以下方式解决了这个任务:
假设您需要递归地在子文件夹中安装许多字体,其结构如下:
\root_folder
    Install_fonts.cmd
    \font_folder_1
        font_1.ttf
        font_2.otf
    \font_folder_2
        font_3.ttf
        font_4.otf
    \font_folder_3
        font_5.ttf
        font_6.otf

为了做到这一点,我在我的桌面上下载了FontReg.exe工具(如果它位于其他位置,请更改Install_fonts.cmd文件中的path),并将其用于如下所示的Install_fonts.cmd批处理脚本中,该脚本位于root_folder中(如果名称不同,请在Install_fonts.cmd文件中也进行更改)。
@echo off
set back=%cd%
for /d %%i in (%USERPROFILE%\Desktop\root_folder\*) do (
cd "%%i"
echo current directory:
cd
start /wait %USERPROFILE%\Desktop\fontreg-2.1.3-redist\bin.x86-64\FontReg.exe /move
timeout /t 1 /nobreak >nul
)
cd %back%
echo Process completed!
pause

因此,您需要以管理员身份在root_folder中运行Install_fonts.cmd,以自动化字体安装过程。

干杯


0

批处理文件示例。它在当前目录中运行。

IF  "%*" NEQ "" SET FONT=%*  (

FOR /F %%i in ('dir /b "%FONT%*.*tf"') DO CALL :DEST %%i

) else (

EXIT

)

:DEST

SET FONTFILE=%~n1%~x1
SET FONTNAME=%~n1


IF "%~x1"==".ttf" SET FONTTYPE=TrueType
IF "%~x1"==".otf" SET FONTTYPE=OpenType

ECHO FILE = %FONTFILE%
ECHO NAME = %FONTNAME:-= %
ECHO TYPE = %FONTTYPE%

fontview  %~dp0%FONTFILE%  


GOTO :EXIT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接