用 PowerShell 查看安装的 .NET 框架

以下 PowerShell 代码最高支持 .NET 4.7 版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse |
Get-ItemProperty -name Version,Release -EA 0 |
Where { $_.PSChildName -match '^(?!S)\p{L}'} |
Select PSChildName, Version, Release, @{
name="Product"
expression={
switch -regex ($_.Release) {
"378389" { [Version]"4.5" }
"378675|378758" { [Version]"4.5.1" }
"379893" { [Version]"4.5.2" }
"393295|393297" { [Version]"4.6" }
"394254|394271" { [Version]"4.6.1" }
"394802|394806" { [Version]"4.6.2" }
"460798" { [Version]"4.7" }
{$_ -gt 460798} { [Version]"Undocumented 4.7 or higher, please update script" }
}
}
}

参考:

修正 SubManager 的一个 bug

目前最好的字幕下载工具是爱页工作室SubManager 字幕管理器。程序通过射手网开放的API自批量动下载电影对应的字幕,省去逐个找字幕的麻烦。其工作原理与射手播放器一致,但有十余项增强。

SubManager 字幕管理器

目前它的最新版是 v2013.7.2,我在使用过程中发现一个问题:

当搜索目录中含有扩展名为空的文件时,程序出现异常:

有关调用实时(JIT)调试而不是此对话框的详细信息,
请参见此消息的结尾。

************** 异常文本 **************
System.ArgumentException: 字符串的长度不能为零。
参数名: oldValue
   在 System.String.Replace(String oldValue, String newValue)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir, String[] fileList)
   在 ShooterDownloader.DownloadForm.PopulateFileList(String dir)
   在 ShooterDownloader.DownloadForm.txtDir_KeyUp(Object sender, KeyEventArgs e)
   在 System.Windows.Forms.Control.OnKeyUp(KeyEventArgs e)
   在 System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
   在 System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
   在 System.Windows.Forms.Control.WmKeyChar(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 System.Windows.Forms.TextBoxBase.WndProc(Message& m)
   在 System.Windows.Forms.TextBox.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Reflector 将 SubManager.exe 反编译,得到它的源代码,定位到 DownloadFormPopulateFileList(String, String[]) : Void 方法。其中只有一行用到 String.Replace() 方法:

if ((File.Exists(info.FullName.Replace(info.Extension, ".srt")) || File.Exists(info.FullName.Replace(info.Extension, ".ass"))) || (File.Exists(info.FullName.Replace(info.Extension, ".ssa")) || File.Exists(info.FullName.Replace(info.Extension, ".smi"))))

把它改为:

if (string.IsNullOrEmpty(info.Extension) || (File.Exists(info.FullName.Replace(info.Extension, ".srt")) || File.Exists(info.FullName.Replace(info.Extension, ".ass"))) || (File.Exists(info.FullName.Replace(info.Extension, ".ssa")) || File.Exists(info.FullName.Replace(info.Extension, ".smi"))))

并重新编译,该错误提示消失了。

我联系了作者 ayeah,他表示将在下一个版本修复。