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

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

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


当前回答

不漂亮。绝对不漂亮:

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

这可能有用,也可能没用。但就最新版本而言,这应该是相当可靠的,因为旧版本(1.0,1.1)基本上都是空文件夹,而新版本则没有——只有在安装了适当的框架之后才会出现这些文件夹。

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

其他回答

我想在PowerShell中试试这个: 为我工作!

(Get-ItemProperty "HKLM:Software\Microsoft\NET Framework Setup\NDP\v4\Full")。版本

不漂亮。绝对不漂亮:

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

这可能有用,也可能没用。但就最新版本而言,这应该是相当可靠的,因为旧版本(1.0,1.1)基本上都是空文件夹,而新版本则没有——只有在安装了适当的框架之后才会出现这些文件夹。

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

以下是我对这个问题的看法:

$gpParams = @{
    Path        = 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full'
    ErrorAction = 'SilentlyContinue'
}
$release = Get-ItemProperty @gpParams | Select-Object -ExpandProperty Release

".NET Framework$(
    switch ($release) {
        ({ $_ -ge 528040 }) { ' 4.8'; break }
        ({ $_ -ge 461808 }) { ' 4.7.2'; break }
        ({ $_ -ge 461308 }) { ' 4.7.1'; break }
        ({ $_ -ge 460798 }) { ' 4.7'; break }
        ({ $_ -ge 394802 }) { ' 4.6.2'; break }
        ({ $_ -ge 394254 }) { ' 4.6.1'; break }
        ({ $_ -ge 393295 }) { ' 4.6'; break }
        ({ $_ -ge 379893 }) { ' 4.5.2'; break }
        ({ $_ -ge 378675 }) { ' 4.5.1'; break }
        ({ $_ -ge 378389 }) { ' 4.5'; break }
        default { ': 4.5+ not installed.' }
    }
)"

这个例子适用于所有PowerShell版本,并且将永远工作,因为4.8是最后一个。net Framework版本。

正确的语法:

[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   

没有可靠的方法可以使用一个简单的脚本为所有平台和体系结构做到这一点。如果你想学习如何可靠地完成它,请从博客文章更新的。net框架检测代码样本开始,它可以进行更深入的检查。