Powershell 写入文件时输出意外换行符

Powershell 写入文件时输出意外换行符

好吧,我承认我是 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 个字符的扩展名。

相关内容