PowerShell脚本在机器上返回.NET Framework的版本?

PowerShell脚本将在机器上返回.NET Framework的版本是什么?

我的第一个猜测是涉及WMI的东西。 有什么更好的吗?

它应该是一个单线程,只返回每个.NET安装的最新版本[在每一行]。

如果你打算使用registry,你必须recursion才能获得4.x框架的完整版本。 以前的答案都返回在我的系统的.NET 3.0的根号码(其中WCF和WPF号码,嵌套在3.0以下,更高 – 我不能解释),并没有返回任何东西的4.0 .. 。

编辑:对于.Net 4.5及以上,这再次略有改变,所以现在有一个很好的MSDN文章,在这里解释如何将释放值转换为.Net版本号,这是一个总火车残骸:-(

这看起来是正确的(请注意,它在3.0上为WCF和WPF输出单独的版本号,我不知道这是什么)。 它也输出4.0和客户端全部 (如果你有他们都安装):

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 

根据MSDN文章,您可以添加一个开关,以在4.5之后返回发行版的营销产品版本号:

 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" } } } } 

基于这篇文章的开关的最后一行。 PowerShell.com

 gci 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' | sort pschildname -des | select -fi 1 -exp pschildname 

如果安装了这个答案不会返回4.5。 从@Jaykul和使用recursion下面的答案。

 [environment]::Version 

为您提供了PSH正在使用的CLR Version实例(如此处所述 )。

正确的语法:

 [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion() #or $PSVersionTable.CLRVersion 

GetSystemVersion函数返回一个像这样的string:

 v2.0.50727 #PowerShell v2.0 in Win 7 SP1 

或者像这样

 v4.0.30319 #PowerShell v3.0 (Windows Management Framework 3.0) in Win 7 SP1 

$PSVersionTable是一个只读对象。 CLRVersion属性是这样一个结构化的版本号:

 Major Minor Build Revision ----- ----- ----- -------- 4 0 30319 18444 

不漂亮。 绝对不漂亮:

 ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer } | select -exp Name -l 1 

这可能会或可能不会工作。 但就最新版本而言,这应该是相当可靠的,因为旧版本(1.0,1.1)基本上都是空文件夹,而不是新版本 – 只有在安装适当的框架后才会出现。

不过,我怀疑一定有更好的办法。

没有可靠的方法来使用简单的脚本为所有平台和体系结构执行此操作。 如果您想了解如何可靠地进行操作,请从更新后的示例.NET Framework检测代码的博客post开始,该代码进行更深入的检查

请参阅脚本以查找哪些.NET版本安装在远程工作站上

那里的脚本可能对findnetworking上多台机器的.NET版本很有用。

我发现这通过在OSX的PowerShell的选项卡完成:

[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03

我没有在我的PowerShell语法,但我想你可以调用System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion() 。 这将返回一个string的版本(类似v2.0.50727 ,我认为)。

增加了对脚本的v4.7.1支持:

 Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -recurse | Get-ItemProperty -name Version,Release -EA 0 | Where { $_.PSChildName -match '^(?![SW])\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|460805" { [Version]"4.7" } "461308|461310" { [Version]"4.7.1" } {$_ -gt 461310} { [Version]"Undocumented version (> 4.7.1), please update script" } } } } 

总体思路如下:

获取.NET Framework目录中的子项,这些子项是名称与模式v号点号相匹配的容器。 按降序sorting,取第一个对象,并返回其名称属性。

这是脚本:

 (Get-ChildItem -Path $Env:windir\Microsoft.NET\Framework | Where-Object {$_.PSIsContainer -eq $true } | Where-Object {$_.Name -match 'v\d\.\d'} | Sort-Object -Property Name -Descending | Select-Object -First 1).Name