You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

询问$PSScriptRoot能否让PowerShell脚本自动识别路径安装Win11字体

Windows 11 批量安装字体脚本路径自动适配方案

问题描述

我有一个从Reddit获取的PowerShell脚本,用于给Windows 11所有用户安装字体。原脚本需要手动指定字体文件夹路径,把脚本复制到其他位置时必须修改路径。我希望脚本能像安装Notepad++的批处理脚本里的cd /d "%~dp0"那样,自动识别自身所在文件夹,不用手动设置路径。查到PowerShell里的$PSScriptRoot,想确认它能不能解决这个问题。

原字体安装脚本

#set font source location
$FontFolder = "FONT LOCATION"
$FontItem = Get-Item -Path $FontFolder

#go through all folders in source and list all fon, otf, ttc and ttf files

$FontList = Get-ChildItem -Path $PSScriptRoot -Include ('*.fon','*.otf','*.ttc','*.ttf') -Recurse
foreach ($Font in $FontList) {
    Write-Host 'Installing font -' $Font.BaseName
    Copy-Item $Font "C:\Windows\Fonts"
  
    #register font for all users
    New-ItemProperty -Name $Font.BaseName -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" -PropertyType string -Value $Font.name
}

参考的Notepad++安装批处理脚本

mode con lines=30 cols=70
@ECHO off
cd /d "%~dp0"
cd /d "%~dp0" && ( if exist "%temp%\getadmin.vbs" del "%temp%\getadmin.vbs" ) && fsutil dirty query %systemdrive% 1>nul 2>nul || (  echo Set UAC = CreateObject^("Shell.Application"^) : UAC.ShellExecute "cmd.exe", "/k cd ""%~sdp0"" && %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs" && "%temp%\getadmin.vbs" && exit /B )
cls
echo.
@echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
@echo   ßß                                                              ßß
@echo    ßß           S O F T E H A R D    S O L U T I O N S           ßß
@echo     ßß                                                          ßß
@echo      ßß       ßßßß    ßßßß     ßß  ßß      ßßßßßß  ßßßßßß      ßß
@echo       ßß     ßß  ßß  ßß  ßß    ßß  ßßß     ßß      ßß  ßß     ßß
@echo        ßß    ßß      ßß        ßß  ßß ßß   ßß      ßß  ßß    ßß
@echo         ßß   ßßßß    ßßßß      ßß  ßß  ßß  ßßßßßß  ßß  ßß   ßß
@echo         ßß     ßßßß    ßßßß    ßß  ßß  ßß  ßß      ßß  ßß   ßß
@echo        ßß        ßß      ßß    ßß  ßß  ßß  ßß      ßß  ßß    ßß
@echo       ßß     ßß  ßß  ßß  ßß    ßß  ßß  ßß  ßß      ßß  ßß     ßß
@echo      ßß       ßßßß    ßßßß     ßß  ßß  ßß  ßß      ßßßßßß      ßß
@echo     ßß                                                          ßß
@echo    ßß                    I N F O R M A T I C A                   ßß
@echo   ßß                                                              ßß
@echo  ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
@CHCP 1252 >NUL                                                        
@Title Silent installation of Notepad++ software version 64-bit..           
echo.                                                                      
echo.         We are starting the silent installation of the software      
echo.                                                                      
echo.                          "Notepad++ 64-bit"                          
echo.                                                                      
echo.                   When the installation is completed                  
echo.             this message will disappear and the application          
echo.             will start so you can configure it before using it.      
echo.                                                                      
@echo OFF
FOR %%i IN ("npp*.exe") DO Set FileName="%%i"
%FileName% /S
echo. Installation completed successfully - Starting Notepad Plus Plus 64-bit!
@Start explorer.exe "%ProgramData%\Microsoft\Windows\Start Menu\Programs\Notepad++.lnk"
timeout /t 4
exit

解决方案

确认:$PSScriptRoot完全满足需求

$PSScriptRoot是PowerShell的内置自动变量,当脚本以.ps1文件形式运行时,它会自动返回脚本所在的文件夹路径,作用和批处理中的%~dp0完全一致,能让脚本无论复制到哪个位置,都自动以自身所在文件夹作为字体来源目录,无需手动修改路径。

修改后的完整字体安装脚本

优化原脚本逻辑,移除冗余代码,用$PSScriptRoot自动获取路径:

# 自动获取脚本所在文件夹作为字体来源路径
$FontFolder = $PSScriptRoot

# 递归查找所有字体格式文件
$FontList = Get-ChildItem -Path $FontFolder -Include '*.fon','*.otf','*.ttc','*.ttf' -Recurse

foreach ($Font in $FontList) {
    Write-Host "正在安装字体 - $($Font.BaseName)"
    
    # 复制字体到系统字体目录(-Force覆盖已存在的同名字体)
    Copy-Item -Path $Font.FullName -Destination "C:\Windows\Fonts" -Force
    
    # 为所有用户注册字体:部分字体需带后缀才能正确识别,这里做适配
    $RegKeyName = switch ($Font.Extension) {
        '.ttc' { "$($Font.BaseName)$($Font.Extension)" }
        '.otf' { "$($Font.BaseName)$($Font.Extension)" }
        default { $Font.BaseName }
    }
    
    # 写入注册表(-Force覆盖已存在的注册项)
    New-ItemProperty -Path "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Fonts" `
        -Name $RegKeyName `
        -PropertyType String `
        -Value $Font.Name `
        -Force
}

Write-Host "所有字体安装完成!"

重要注意事项

  1. 运行权限:脚本需要以管理员身份运行,因为要写入系统字体文件夹和HKLM注册表项,你可以参考批处理的UAC提权逻辑,给PowerShell脚本添加自动提权代码。
  2. 生效条件:$PSScriptRoot仅在脚本保存为.ps1文件并运行时生效,直接在PowerShell控制台逐行执行代码时该变量为空。
  3. 字体注册表适配:部分字体(如TTC、OTF格式)的注册表项名称必须包含文件后缀才能被系统正确识别,脚本中已加入适配逻辑,可根据实际字体情况调整。

内容的提问来源于stack exchange,提问作者Suporte.SoftehardSolutions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:32:06