好吧,我承认我是 PS 的新手,我正在通过拼凑从各个地方获取的一两个命令来编写脚本。
我正在读取注册表以获取用户机器上已安装字体的列表。(它只执行一次,即当用户首次运行程序时,并写出一个文件)
if (!(Test-Path $ScriptDir/fnt_files/psFonts.js)){
$reg = Get-ItemProperty -Path Registry::"HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\Fonts"
Out-File $ScriptDir/fnt_files/psFonts.txt -InputObject $reg -Encoding unicode
}
但结果有点奇怪......
Arial (TrueType) : a
r
i
a
l
.
t
t
f
Arial Black (TrueType) : a
r
i
b
l
k
.
t
t
f
也就是说,第一部分是正确的,但在连字符之后,单词被隔开,每行放置一个字母。我尝试了 ASCII 和 Unicode,但都没有任何效果。
刚刚检查了十六进制,似乎比我想象的还要糟糕。第一个字母是“ODOA”……后面跟着 111 个“20”,下一个字母“ODOA”有 111 个空格(???)
巧合的是,输出与 CMD 中的相同命令完全不同,并创建了一组完全不同的字体??
这让我彻底困惑了!
更新:有人要求我添加我正在运行的 CMD 版本:
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\Fonts" /s > ../fnt_files/FontList.txt"
(经检查,下面列出的 CSV 脚本选取了 REGEDIT 中未显示的字体...但仍然返回 100 种字体,比上面的 CMD 直接从 REGEDIT 获取文件列表少!!好的,所以 400 种字体对我的项目来说已经足够了,但是=现在=我只是好奇发生了什么!)
更新 2:天哪!脸色难看!显示更多字体的那个是由 Win7 生成的。但我刚刚升级到 Win10,所以字体结构已经改变了!!
答案1
Out-File
可能会给您宽度/文字换行问题,但Export-Csv
更容易使用。
if (!(Test-Path $ScriptDir/fnt_files/psFonts.js)){
$reg = Get-ItemProperty -Path Registry::"HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\Windows NT\CurrentVersion\Fonts"
$data = $reg.PSObject.Properties.Where({$_.MemberType -eq "NoteProperty" -and $_.Value -match "\..{3}$"}) | Select-Object Name, Value
$data | Export-Csv -Path $ScriptDir/fnt_files/psFonts.csv -NoTypeInformation
}
我假设所有字体都有 3 个字符的扩展名。