我正在尝试通过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.Auto
或unicode
,但都不起作用:
[DllImport("gdi32.dll", CharSet=CharSet.Unicode)]
当我添加以下内容时,得到的错误是:
Add-Type:无法添加类型。类型名称“AddFontResource.FontUtils”已存在。
有人知道该怎么处理吗?
谢啦,谢啦
1条答案
按热度按时间68de4m5k1#
要获得完全的Unicode支持,必须使用
CharSet = CharSet.Unicode
限定P/Invoke声明,这将确保(隐式)引用 * Unicode * 版本的WinAPI函数,即AddFontResourceW
:The type name 'AddFontResource.FontUtils' already exists.
,请 * 启动一个新会话 *,因为这意味着该类型的 * 先前 * 定义阻止了其 * 重新定义 *。