powershell gdi32为非拉丁名字的会话安装字体

kpbwa7wx  于 2022-12-29  发布在  Shell
关注(0)|答案(1)|浏览(107)

我正在尝试通过PowerShell脚本以临时方式为当前会话安装字体。
下面提供了我当前的脚本,但问题是,如果字体名为“somelatin_font.ttf”,它将正常工作,但如果字体名称中包含一些非拉丁字符(例如日语),它将无法安装

$dir="fonts"

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

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

foreach($font in  (Get-ChildItem -LiteralPath $dir -Recurse  | Where-Object {$_.extension -in ".ttf", ".otf"}) ) {   
    $ffn= $font.FullName
    echo "loading($ffn)" >> file.txt
    $type::AddFontResource($font)
}

我还尝试添加CharSet = CharSet.Autounicode,但都不起作用:

[DllImport("gdi32.dll", CharSet=CharSet.Unicode)]

当我添加以下内容时,得到的错误是:
Add-Type:无法添加类型。类型名称“AddFontResource.FontUtils”已存在。
有人知道该怎么处理吗?
谢啦,谢啦

68de4m5k

68de4m5k1#

要获得完全的Unicode支持,必须使用CharSet = CharSet.Unicode限定P/Invoke声明,这将确保(隐式)引用 * Unicode * 版本的WinAPI函数,即AddFontResourceW

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

$type =
  Add-Type -MemberDefinition $signature `
    -Name FontUtils -Namespace AddFontResource `
    -Using System.Text -PassThru
    • 注**:
  • 如果您收到错误消息The type name 'AddFontResource.FontUtils' already exists.,请 * 启动一个新会话 *,因为这意味着该类型的 * 先前 * 定义阻止了其 * 重新定义 *。

相关问题