要在计算机上返回.NET Framework的版本,PowerShell脚本应该是什么?

我的第一个猜测与WMI有关.还有更好的吗?

它应该是只返回每个.NET安装的最新版本(每行)的一行程序.

推荐答案

如果要使用注册表,必须递归才能获得4的完整版本.x框架.前面的答案都返回我的系统上的根数.NET 3.0(其中嵌套在3.0下的WCF和WPF编号更高——我无法解释这一点),并且无法返回4.0的任何内容...

编辑:谢谢.Net 4.5及更高版本,这一点再次发生了轻微的变化,所以现在有一个很好的MSDN article here,解释了如何将Release值转换为.Net版本号,这是一个完整的火车失事:-(

在我看来这是正确的(请注意,它在3.0上为WCF和WPF输出了不同的版本号.我不知道这是怎么回事).它还可以在4.0上输出ClientFull(如果您已经安装了它们):

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之后发布的市场营销产品版本号:

$Lookup = @{
    378389 = [version]'4.5'
    378675 = [version]'4.5.1'
    378758 = [version]'4.5.1'
    379893 = [version]'4.5.2'
    393295 = [version]'4.6'
    393297 = [version]'4.6'
    394254 = [version]'4.6.1'
    394271 = [version]'4.6.1'
    394802 = [version]'4.6.2'
    394806 = [version]'4.6.2'
    460798 = [version]'4.7'
    460805 = [version]'4.7'
    461308 = [version]'4.7.1'
    461310 = [version]'4.7.1'
    461808 = [version]'4.7.2'
    461814 = [version]'4.7.2'
    528040 = [version]'4.8'
    528049 = [version]'4.8'
}

# For One True framework (latest .NET 4x), change the Where-Object match 
# to PSChildName -eq "Full":
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
  Get-ItemProperty -name Version, Release -EA 0 |
  Where-Object { $_.PSChildName -match '^(?!S)\p{L}'} |
  Select-Object @{name = ".NET Framework"; expression = {$_.PSChildName}}, 
@{name = "Product"; expression = {$Lookup[$_.Release]}}, 
Version, Release

事实上,由于我一直需要更新这个答案,这里有一个脚本,可以从该网页的markdown 源生成上面的脚本(还有一点额外内容).这可能会在某个时候中断,所以我保留上面的当前副本.

# Get the text from github
$url = "https://raw.githubusercontent.com/dotnet/docs/master/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md"
$md = Invoke-WebRequest $url -UseBasicParsing
$OFS = "`n"
# Replace the weird text in the tables, and the padding
# Then trim the | off the front and end of lines
$map = $md -split "`n" -replace " installed [^|]+" -replace "\s+\|" -replace "\|$" |
    # Then we can build the table by looking for unique lines that start with ".NET Framework"
    Select-String "^.NET" | Select-Object -Unique |
    # And flip it so it's key = value
    # And convert ".NET FRAMEWORK 4.5.2" to  [version]4.5.2
    ForEach-Object { 
        [version]$v, [int]$k = $_ -replace "\.NET Framework " -split "\|"
        "    $k = [version]'$v'"
    }

# And output the whole script
@"
`$Lookup = @{
$map
}

# For extra effect we could get the Windows 10 OS version and build release id:
try {
    `$WinRelease, `$WinVer = Get-ItemPropertyValue "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" ReleaseId, CurrentMajorVersionNumber, CurrentMinorVersionNumber, CurrentBuildNumber, UBR
    `$WindowsVersion = "`$(`$WinVer -join '.') (`$WinRelease)"
} catch {
    `$WindowsVersion = [System.Environment]::OSVersion.Version
}

Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
    Get-ItemProperty -name Version, Release -EA 0 |
    # For The One True framework (latest .NET 4x), change match to PSChildName -eq "Full":
    Where-Object { `$_.PSChildName -match '^(?!S)\p{L}'} |
    Select-Object @{name = ".NET Framework"; expression = {`$_.PSChildName}}, 
                @{name = "Product"; expression = {`$Lookup[`$_.Release]}}, 
                Version, Release,
    # Some OPTIONAL extra output: PSComputerName and WindowsVersion
    # The Computer name, so output from local machines will match remote machines:
    @{ name = "PSComputerName"; expression = {`$Env:Computername}},
    # The Windows Version (works on Windows 10, at least):
    @{ name = "WindowsVersion"; expression = { `$WindowsVersion }}
"@

.net相关问答推荐

节省用户在整个应用程序中使用的Flutter

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

为什么脚本不从 _Layout 加载并且必须添加到部分视图中?

NuGet 兼容与计算框架(Xamarin 和 .NET 6)

如何使用 awslocal 通过 localstack 中的 cloudwatch events/eventbridge 触发 lambda

C# 中的批量更新

ReaderWriterLock 与锁{}

找不到 Assert.Fail 和 Assert.Pass 或等效项

在 C# 中使用委托

软件包版本始终为 1.0.0,带有 dotnet pack

测试没有预期的异常

没有 @Html.Button !

什么是 ToString("N0") 格式?

使用 XmlDocument 读取 XML 属性

log4net的正确使用方法(记录器命名)

DLL 中有什么以及它是如何工作的?

SqlBulkCopy 的推荐批量大小是多少?

.NET 的 XPath 和 XSLT 2.0?

表单不响应 KeyDown 事件

Linq Query 不断抛出无法创建 System.Object 类型的常量值......,为什么?