Bir makinede .NET Framework sürümlerini döndürmek için PowerShell betiği?


182

Bir makinede .NET Framework sürümlerini döndürmek için bir PowerShell betiği ne olurdu?

İlk tahminim WMI ile ilgili bir şey. Daha iyi bir şey var mı?

Her bir .NET yüklemesi için [her satırda] yalnızca en son sürümü döndürmek tek satırlı olmalıdır.


7
Bir makinenin Fx'in birden fazla sürümü olabilir (ve olacaktır) . Bununla nasıl başa çıkmak istiyorsun? Ve sonra Fx2 .. Fx3.5SP1 karışıklığı var. Hangi sürümü duymak istiyorsunuz?
Henk Holterman

Her yükleme için tam sürüm numarasını döndürmek gerektiğini düşünüyorum.
MattUebel

1
WMI ile bunu yapmanın bir yolu yok mu?
Mark Richman

PowerShell'i istediniz, C # (konsol uygulaması) için bir şey yaptım. Eğer ilgileniyorsanız, işte ...
Matt

Böyle bir şey olmaması gerçekten inanılmaz:asp.net -v
Altimus Prime

Yanıtlar:


354

Kayıt defterini kullanacaksanız, 4.x Framework'ün tam sürümünü almak için tekrar edinmeniz gerekir. Önceki yanıtlar hem .NET 3.0 için sistemimdeki kök numarasını döndürür (burada, 3.0'ın altında iç içe yerleştirilmiş WCF ve WPF numaraları daha yüksektir - bunu açıklayamam) ve 4.0 için hiçbir şey döndüremiyor. .

EDIT: .Net 4.5 ve üstü için bu biraz değişti, bu yüzden şimdi Release değerini bir .Net sürüm numarasına nasıl dönüştüreceğinizi açıklayan güzel bir MSDN makalesi var , bu bir toplam tren kazası :-(

Bu bana doğru görünüyor (3.0'da WCF ve WPF için ayrı sürüm numaraları çıkardığını unutmayın. Bunun ne olduğunu bilmiyorum). Aynı zamanda hem çıkarır Client ve Full (onları hem kurulu ise) 4.0 tarih:

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 makalesine dayanarak, bir arama tablosu oluşturabilir ve 4.5'ten sonraki sürümler için pazarlama ürünü sürüm numarasını döndürebilirsiniz:

$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

Aslında, bu yanıtı güncellemeye devam ettiğim için, bu web sayfasının işaretleme kaynağından yukarıdaki komut dosyasını (biraz ekstra) oluşturmak için bir komut dosyası. Bu muhtemelen bir noktada kırılacak, bu yüzden mevcut kopyayı yukarıda tutuyorum.

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

Ben de tam aradığım şey bu, ama tam olarak bunun ne yaptığına karar vermekte zorlanıyorum. Anladığım kadarıyla, NDP kayıt defterine gidiyor ve '^(?!S)\p{L}'düzenli olarak regex ve Sürüm ve Sürüm bilgileri alma her klasörde arama . Bu düzenli ifade tam olarak ne yapmaya çalışıyor?
Johnrad

2
@Johnrad PSChildName, kayıt defteri anahtarının yaprak adıdır. \p{L}"Unicode" kategorisindeki herhangi bir karakterdir. (?!S), etrafa olumsuz bir bakış ^ve dizenin başlangıcıdır. Bu yüzden başka bir harfle başlamalıdır S. Yani sadece ASCII'yi düşünürseniz, aynıdır $_.PSChildName -cmatch '^[A-RT-Za-z]'(not edin -cmatch). Böylece ismin dışında bir harfle başladığı anahtarları bulur S. Eğer isimleri ile başlayan filtreler eğer ASCII olmayan neden umursamıyorum hiçbir fikrim yok S... Kesinlikle üzerinde bu kadar kafa karıştırıcı olması ile.
jpmc26

1
Şimdi haltın ne yaptığı hakkında daha çok kafam karıştı Get-ItemProperty -name Version,Release -EA 0. Benimle -EA 0aynı olduğunu biliyorum -ErrorAction SilentlyContinue, ama Get-ItemProperty -name Version,Releasetüm sonuçları piping zaman ne etkisi olurdu ? Diğerleri ardışık düzendeki sonraki komutlarda kullanıldığından, nesneden herhangi bir değişken çıkarmıyor gibi görünüyor. Çalışır , anahtarda Versionveya Releaseadı eksik olduğunda hata yapar ve başarılı olduğu nesneleri ardışık düzende sonraki komuta iletir mi?
16:16

3
Get-ChildItem TÜM kayıt defteri alt anahtarlarını döndürür (isterseniz alt klasörler). Get-ItemProperty değerleri döndürür (özellikle: "Sürüm" ve "Serbest Bırak") - bu değerleri içermeyen klasörleri umursamadığımız için hataları görmezden geliriz. Yani evet, temel olarak HER alt klasörü buluruz ve ardından Sürüm veya Sürüm'ü ararız (bunlardan biri veya ikisi birden bulunmayan klasörler yok sayılır).
Jaykul

3
Müthiş! Ben sadece "Windows *" girişleri hariç tutmak için (?!S)yan tümce değiştirdim (?![SW]). Bu, (?=[vCF])gerçekten umursadığımız tek anahtarın Sürüm kökleri ve .NET 4.0+ için "Tam" ve "İstemci" anahtarları olmasıyla da yapılabilir. ;)
Chiramisu

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

Bu yanıt yüklüyse 4.5 döndürmez. Aşağıdaki cevap @Jaykul ve recurse kullanma yapar.


5
gci 'HKLM: \ YAZILIM \ Microsoft \ NET Framework Kurulumu \ NDP' | pschildname sırala -des | foreach-object {$ _. ad; $ _. GetValue ("Sürüm");}
MattUebel

benim için cevap şimdi üstte burada bir bağlantı :-): stackoverflow.com/a/3495491/1747983
Tilo

1
Windows 10'a .NET 4.7.1 yükledikten sonra bu sürüm v4.0 değerini döndürür.
Matt

24

Komut dosyasına v4.8 desteği eklendi:

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

21
[environment]::Version

PSH'nin Versiongeçerli kopyasının kullandığı ( burada belgelendiği gibi ) CLR için bir örnek verir .


3
.NET 4 yükledim, ancak PowerShell yalnızca 2.0 çalışma zamanını kullanacak. Yani burada gerçekten yardımcı olmuyor.
Joey

@Johannes: Q'nuzun yorumuna bakın, ne istediğiniz konusunda açık olmanız gerekir.
Richard

9
Powershell 2.0 için, $PSVersionTableCLR PowerShell'in çalışmakta olan sürümünü bulmak için de kullanabilirsiniz .
Keith Hill

6
Daha yüksek sürümlere ne dersiniz? Şimdi .NET 4.7.1 var ve komut dosyası her zaman 4.0.30319 Rev. 42000 döndürür.
Matt

@Matt, sürümün küçük bir bölümünü çevirmeniz gerekecek ... ve Powershell'in yapılandırmasında nelerin ayarlandığına bağlı olarak, en son küçük / yama sürümünü kullanmıyor olabilir.
Richard

13

Doğru sözdizimi:

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

GetSystemVersionFonksiyonu böyle bir dize döndürür:

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

ya da bunun gibi

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

$PSVersionTablesalt okunur bir nesnedir. CLRVersion özelliği aşağıdaki gibi yapılandırılmış bir sürüm numarasıdır:

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

1
Bunu win8'de denedim, hiçbir şey döndürmüyor. Windows 7'de 4.5.1 zaten yüklü iken 2 döndürür. Bunun neden yeni platformlarda kullanılamadığını bilmiyorum. Win sesrver 2008'de çalışıyor.
maksimum

İlk seçenek Windows 8, 64 bit ortamımda çalışıyor. İkinci seçenek çalışır, ancak sadece geçerli PowerShell örneğinin çalıştığı .NET sürümünü gösterir, ki bu her zaman en sondur. (Düzenleme: Belki ikisi de yapar.)
Vimes

burada aynı. Windows 7'de, hem .net 2.0 hem de 4.0 var ama komut sadece v2.0.50727 gösteriyor. Jaykul'un yaklaşımını kullanın.
max

Clr sürümü çerçeve sürümüne eşit değil, 4+ çerçevelerin hepsi 4 clr dayanmaktadır
janv8000

Daha yüksek sürümlere ne dersiniz? Şimdi .NET 4.7.1 var ve komut dosyası her zaman 4.0.30319 Rev. 42000 döndürür.
Matt

11

Ben osx için powershell sekme tamamlanması ile buldum:

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


1
Evet, .NET Framework 4.7.2558.0 döndürür - ancak 4.7'yi 4.7.1'den nasıl ayırt edebilirim (Windows 10 makinemde 4.7.1 var).
Matt

1
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Rabash



2

Güzel çözüm

İndirilebilir DotNetVersionLister modülünü kullanmayı deneyin (kayıt defteri bilgilerini ve bazı sürümden pazarlama sürümüne arama tablosunu temel alır).

Hangi gibi kullanılır:

PS> Get-DotNetVersion -LocalHost -nosummary


ComputerName : localhost
>=4.x        : 4.5.2
v4\Client    : Installed
v4\Full      : Installed
v3.5         : Installed
v3.0         : Installed
v2.0.50727   : Installed
v1.1.4322    : Not installed (no key)
Ping         : True
Error        :

Ya da sadece bazı .NET framework> = 4 için test etmek istiyorsanız bu gibi : * :

PS> (Get-DotNetVersion -LocalHost -nosummary).">=4.x"
4.5.2

Ancak uyumsuzluk nedeniyle PS v2.0 ( Win 7 , Win Server 2010 standardı) ile çalışmaz (yükleme / içe aktarma) ...

Aşağıdaki "eski" işlevler için motivasyon

(Bunu okumayı atlayabilir ve aşağıdaki kodu kullanabilirsiniz)

PS 2.0 ile bazı makinelerde çalışmak zorunda kaldık ve yukarıdaki DotNetVersionLister'ı yükleyemedik / içe aktaramadık .
Diğer makinelerde ( PS 2.0'dan ) PS 5.1'e güncellemek istedik (bu da .NET Framework> = 4.5'e ihtiyaç duyuyor) ) iki şirket-custom Install-DotnetLatestCompanyve Install-PSLatestCompany.
Yöneticileri yükleme / güncelleme işlemi boyunca güzel bir şekilde yönlendirmek için, mevcut tüm makinelerde ve PS sürümlerinde bu işlevlerde .NET sürümünü belirlememiz gerekir.
Bu nedenle, tüm ortamlarda daha güvenli bir şekilde belirlemek için aşağıdaki işlevleri de kullandık ...

Eski PS ortamları için işlevler (örneğin PS v2.0 )

Dolayısıyla, aşağıdaki kod ve aşağıdaki (ayıklanmış) kullanım örnekleri burada yararlıdır (buradaki diğer yanıtlara dayanarak):

function Get-DotNetVersionByFs {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion 
          from DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0 
        Get-DotNetVersionByReg
          reg(istry) based: (available herin as well) but it may return some wrong version or may not work reliably for versions > 4.5 
          (works in PSv2.0)
      Get-DotNetVersionByFs (this):  
        f(ile) s(ystem) based: determines the latest installed .NET version based on $Env:windir\Microsoft.NET\Framework content
        this is unreliable, e.g. if 4.0* is already installed some 4.5 update will overwrite content there without
        renaming the folder
        (works in PSv2.0)
    .EXAMPLE
      PS> Get-DotnetVersionByFs
      4.0.30319
    .EXAMPLE
      PS> Get-DotnetVersionByFs -All
      1.0.3705
      1.1.4322
      2.0.50727
      3.0
      3.5
      4.0.30319
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
  param(
    [Switch]$All  ## do not return only latest, but all installed
  )
  $list = ls $Env:windir\Microsoft.NET\Framework |
    ?{ $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } |
    %{ $_.Name.TrimStart('v') }
  if ($All) { $list } else { $list | select -last 1 }
}


function Get-DotNetVersionByReg {
  <#
    .SYNOPSIS
      NOT RECOMMENDED - try using instead:
        Get-DotNetVersion
          From DotNetVersionLister module (https://github.com/EliteLoser/DotNetVersionLister), 
          but it is not usable/importable in PowerShell 2.0. 
          Determines the latest installed .NET version based on registry infos under 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP'
    .EXAMPLE
        PS> Get-DotnetVersionByReg
        4.5.51209
    .EXAMPLE
        PS> Get-DotnetVersionByReg -AllDetailed
        PSChildName                                          Version                                             Release
        -----------                                          -------                                             -------
        v2.0.50727                                           2.0.50727.5420
        v3.0                                                 3.0.30729.5420
        Windows Communication Foundation                     3.0.4506.5420
        Windows Presentation Foundation                      3.0.6920.5011
        v3.5                                                 3.5.30729.5420
        Client                                               4.0.0.0
        Client                                               4.5.51209                                           379893
        Full                                                 4.5.51209                                           379893
    .NOTES
      from https://stackoverflow.com/a/52078523/1915920
  #>
    [cmdletbinding()]
    param(
        [Switch]$AllDetailed  ## do not return only latest, but all installed with more details
    )
    $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'
    }
    $list = Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse |
        Get-ItemProperty -name Version, Release -EA 0 |
        # For 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
    if ($AllDetailed) { $list | sort version } else { $list | sort version | select -last 1 | %{ $_.version } }
}

Örnek kullanım:

PS> Get-DotNetVersionByFs
4.0.30319

PS> Get-DotNetVersionByFs -All
1.0.3705
1.1.4322
2.0.50727
3.0
3.5
4.0.30319

PS> Get-DotNetVersionByReg
4.5.51209

PS> Get-DotNetVersionByReg -AllDetailed

.NET Framework                   Product Version        Release
--------------                   ------- -------        -------
v2.0.50727                               2.0.50727.5420
v3.0                                     3.0.30729.5420
Windows Communication Foundation         3.0.4506.5420
Windows Presentation Foundation          3.0.6920.5011
v3.5                                     3.5.30729.5420
Client                                   4.0.0.0
Client                           4.5.2   4.5.51209      379893
Full                             4.5.2   4.5.51209      379893

(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Zamanlamaları görememek

@ ΩmegaMan: thx - yukarıdaki cevabınızdaki iyi tavsiyenizi güncelleyin :)
Andreas Dietrich

1

Güzel değil. Kesinlikle hoş değil:

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

Bu işe yarayıp yaramayabilir. Ancak, en son sürüm söz konusu olduğunda, eski sürümler (1.0, 1.1) için esasen boş klasörler olduğu için, ancak daha yeni olanlar için değil, bu oldukça güvenilir olmalıdır - bunlar sadece uygun çerçeve yüklendikten sonra görünür.

Yine de daha iyi bir yol olması gerektiğinden şüpheleniyorum.


Biraz daha fazla filtre gerekir, "V [.0-9] +" .NET klasörleri ile eşleşmelidir (Ben orada başka bazı klasörler var). Ve sonra gerçek bir kurulum olup olmadığını kontrol edin ... Kurulu bileşenler üzerindeki WMI daha kolay olabilir.
Richard

Hım, doğru ... bu makinede birkaç klasör daha var - diğer makinemde sadece bir sürü başka dosya vardı. Bütün bu cevap daha çok "benim için çalışıyor" vakasıydı. Eminim bu bilgiyi almanın güvenilir ve amaçlanan bir yolu vardır.
Joey

6
psake (inşa otomasyon aracı) benzer bir yaklaşımı benimser ve başarılı bir şekilde kullanır (ya da en azından kimse bir sorun nedeniyle değiştirmedi). Ama tam çerçeve sürümüne ihtiyaç duymadıkları doğrudur ... Bilgisayarım için bu yaklaşıyor:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
stej

Cevaplardaki tüm tek satırlardan stej tarafından sağlanan en temiz ve beklendiği gibi çalışır. Cevap olsaydı ben oy verirdim.
Bratch

Ne yazık ki, güvenilir değil. Şimdi .NET 4.7.1 var ve komut dosyası her zaman v4.0.30319 döndürür.
Matt

0

Makinenize Visual Studio yüklediyseniz, Visual Studio Geliştirici Komut İstemi'ni açın ve aşağıdaki komutu yazın: clrver

Bu makinede yüklü olan tüm .NET Framework sürümlerini listeler.


Bu komut, farklı olan .NET Framework sürümünü değil CLR sürümünü alır.
user11909

0

İşte msft belgelerini izleyerek bu soruyu benim almak :

$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.' }
    }
)"

Bu örnek tüm PowerShell sürümleriyle çalışır ve 4.8 son .NET Framework sürümü olduğundan kalıcı olarak çalışır.


-1

İşte genel fikir:

.NET Framework dizininde, adları desen v numarası nokta numarasıyla eşleşen kaplar olan alt öğeleri alın . Onları azalan ada göre sıralayın, ilk nesneyi alın ve name özelliğini döndürün.

İşte senaryo:

(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

Ben 4.6.1 yüklemiş ancak komut döner v4.0.30319
soymak

Bu benim makinemde çalışmıyor (4.7.1 kurulu). Bu basar v4.0.30319
Matt

-1

Bunu PowerShell'de denerdim: Benim için çalıştı!

(Get-ItemProperty "HKLM: Yazılım \ Microsoft \ NET Framework Kurulumu \ NDP \ v4 \ Full"). Sürüm


Bu size gerçeği söylemiyor. Buradaki sürüm numarası, örneğin ürün sürümü 4.7.2 olduğunda 4.7.03056
Jaykul

-2

PowerShell sözdizimimde değilim, ancak System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () öğesini çağırabileceğinizi düşünüyorum . Bu sürüm bir dize olarak dönecektir ( v2.0.50727sanırım bir şey gibi ).


2
Şu anda yürütülen çalışma zamanı için, mutlaka en son yüklenen çalışma zamanı değildir.
Joey

[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()Powershell için doğru sözdizimi:, ancak benim durumumda v4.6 yüklü olsa bile, sadece v4.0.30319 döndürür.
Matt

@matt 4.0.30319, .Net Framework 4.0 ile .Net Framework 4.7.1 arasındaki CLR sürümüdür. Yani v4.6 çerçeveniz aslında CLR sürümü olarak 4.0.30319 kullanıyor. Sürümün yalnızca Revizyon bölümünün tüm .Net Çerçeveleri arasındaki fark olduğuna dikkat edin. Ayrıca Bakınız: .NET Framework Sürümleri ve Bağımlılıkları - Microsoft Docs
walterlv

@walterlv - Bağlantı için teşekkür ederim. Evet, bunun farkındayım. Microsoft bunu yapmak için büyük bir hata yaptı, bir sunucuya uzaktan bağlanmak ve tam olarak hangi .net sürümünün yüklü olduğunu bulmak kolay değildir. Yöneticiler ve geliştiriciler için bir başka büyük baş ağrısı.
Matt

Ve bu da yardımcı olabilir: Microsoft: .NET Framework sürümleri ve hizmet paketi düzeyleri nasıl belirlenir . Ayrıca, makinenize tam olarak ne yüklendiğini bulmanın ne kadar karmaşık olduğunu da gösterir ... :-(
Matt

-2

Bu önceki yazının bir türevidir, ancak bu testlerimde .net framework 4'ün en son sürümünü alır.

get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL"

Bu, uzak makineye komut çağırmanızı sağlar:

invoke-command -computername server01 -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} 

Bu olasılığı ADModule ve adlandırma kuralı önekiyle ayarlar:

get-adcomputer -Filter 'name -like "*prefix*"' | % {invoke-command -computername $_.name -scriptblock {get-itemproperty -name version,release "hklm:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\FULL" | select pscomputername,version,release} | ft
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.