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

我的第一个猜测是与WMI有关。还有更好的办法吗?

它应该是一行程序,在每一行上只返回。net安装的最新版本。


当前回答

正确的语法:

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

GetSystemVersion函数返回一个像这样的字符串:

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框架检测代码样本开始,它可以进行更深入的检查。

如果您已经在计算机上安装了Visual Studio,那么打开Visual Studio开发人员命令提示符并键入以下命令: clrver

它将列出该机器上所有已安装的。net Framework版本。

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

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" }
        "461808|461814" { [Version]"4.7.2" }
        "528040|528049" { [Version]"4.8" }
        {$_ -gt 528049} { [Version]"Undocumented version (> 4.8), please update script" }
      }
    }
}
[environment]::Version

为当前PSH副本正在使用的CLR提供一个Version实例(如本文所述)。