किसी मशीन पर .NET फ्रेमवर्क के संस्करणों को वापस करने के लिए PowerShell स्क्रिप्ट?


182

किसी मशीन पर .NET फ्रेमवर्क के संस्करणों को वापस करने के लिए एक PowerShell स्क्रिप्ट क्या होगी?

मेरा पहला अनुमान कुछ WMI को शामिल करना है। क्या कुछ बेहतर है?

.NET की प्रत्येक स्थापना के लिए केवल नवीनतम संस्करण को वापस करने के लिए यह एक-लाइनर होना चाहिए [प्रत्येक पंक्ति पर]।


7
एक मशीन Fx के कई संस्करण कर सकती है (और करेगी) । आप इसे कैसे संभालना चाहते हैं? और फिर Fx2 है .. Fx3.5SP1 गड़बड़। आप किस संस्करण को सुनना चाहते हैं?
हेनक होल्टरमैन

मुझे लगता है कि प्रत्येक इंस्टॉल के लिए पूर्ण संस्करण संख्या वापस करना आवश्यक होगा।
मट्टूबेल

1
WMI के माध्यम से ऐसा करने का कोई तरीका नहीं है?
मार्क रिचमैन

आपने PowerShell के लिए कहा, मैंने C # (कंसोल एप्लिकेशन) के लिए कुछ बनाया है। यदि आप रुचि रखते हैं, तो यह यहाँ है ...
मैट

यह वास्तव में अविश्वसनीय है कि ऐसा कुछ नहीं है:asp.net -v
Altimus Prime

जवाबों:


353

यदि आप रजिस्ट्री का उपयोग करने जा रहे हैं, तो आपको 4.x फ्रेमवर्क के लिए पूर्ण संस्करण प्राप्त करने के लिए पुनरावृत्ति करना होगा। पहले के उत्तर दोनों .NET 3.0 के लिए मेरे सिस्टम पर रूट नंबर लौटाते हैं (जहाँ WCF और WPF संख्याएँ, जो 3.0 के तहत नेस्टेड हैं, उच्चतर हैं - मैं उसे समझा नहीं सकता), और 4.0 के लिए कुछ भी वापस करने में असफल रहा। ।

संपादित करें: .Net 4.5 और ऊपर के लिए, यह थोड़ा फिर से बदल गया है, इसलिए अब यहाँ एक अच्छा MSDN लेख है जो समझा रहा है कि .net संस्करण संख्या में रिलीज़ मान को कैसे परिवर्तित किया जाए , यह कुल ट्रेन मलबे है :-(

यह मुझे सही लगता है (ध्यान दें कि यह 3.0 पर डब्ल्यूसीएफ और डब्ल्यूपीएफ के लिए अलग-अलग संस्करण संख्याओं को आउटपुट करता है। मुझे नहीं पता कि यह क्या है)। यह 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 के बाद रिलीज़ के लिए मार्केटिंग उत्पाद संस्करण संख्या वापस कर सकते हैं:

$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

वास्तव में, जब से मैं इस उत्तर को अद्यतन करना जारी रखता हूं, उस वेब पेज के लिए मार्कडाउन स्रोत से ऊपर स्क्रिप्ट (थोड़ी अतिरिक्त के साथ) उत्पन्न करने के लिए एक स्क्रिप्ट है। यह शायद किसी बिंदु पर टूट जाएगा, इसलिए मैं वर्तमान प्रतिलिपि ऊपर रख रहा हूं।

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

यह वही है जो मैं भी देख रहा हूं, लेकिन मैं एक कठिन समय के साथ अपने दिमाग को लपेट रहा हूं कि यह वास्तव में क्या कर रहा है। जो मैं समझता हूं कि वह एनडीपी रजिस्ट्री के लिए जा रहा है और रीसैक्स को फिट करने वाले प्रत्येक फ़ोल्डर के माध्यम से खोज कर '^(?!S)\p{L}'रहा है और संस्करण और रिलीज़ जानकारी प्राप्त कर रहा है। वास्तव में यह क्या है कि नियमित अभिव्यक्ति अर्हता प्राप्त करने की कोशिश कर रही है?
जॉरनड

2
@ जोहड़ PSChildNameरजिस्ट्री कुंजी का पत्ता नाम है। \p{L}यूनिकोड श्रेणी "अक्षर" में कोई भी वर्ण है। (?!S)चारों ओर एक नकारात्मक रूप है, और ^यह स्ट्रिंग की शुरुआत है। इसलिए इसे एक पत्र के अलावा शुरू करना होगा S। इसलिए यदि आप केवल ASCII पर विचार करते हैं, तो यह $_.PSChildName -cmatch '^[A-RT-Za-z]'(नोट -cmatch) के समान है। तो यह उन कुंजियों को खोजता है जहां नाम के अलावा एक अक्षर से शुरू होता है S। मुझे नहीं पता कि आप गैर-एएससीआईआई के बारे में क्यों परवाह करेंगे यदि आप नामों को शुरू करने से दूर कर रहे हैं S... निश्चित रूप से आपके साथ यह इतना भ्रमित हो रहा है।
jpmc26

1
अब मैं और अधिक उलझन में हूँ कि बिल्ली क्या Get-ItemProperty -name Version,Release -EA 0कर रही है। मुझे पता -EA 0है कि जैसा है -ErrorAction SilentlyContinue, लेकिन Get-ItemProperty -name Version,Releaseइसके परिणाम को पूरा करते समय क्या प्रभाव पड़ेगा ? यह ऑब्जेक्ट से किसी भी चर को अलग करने के लिए प्रतीत नहीं होता है, क्योंकि अन्य का उपयोग पाइपलाइन में बाद के आदेशों में किया जाता है। क्या यह तब चलता है, जब त्रुटि Versionया Releaseनाम कुंजी से गायब होता है, और फिर उन वस्तुओं को पास करता है जहां यह पाइपलाइन में अगले कमांड में सफल हुआ था?
jpmc26

3
Get-ChildItem सभी रजिस्ट्री उपकुंजियों (सबफ़ोल्डर्स, यदि आप करेंगे) लौटाता है। Get-ItemProperty मान लौटाता है (विशेष रूप से: "संस्करण" और "रिलीज़") - हम त्रुटियों को अनदेखा करते हैं क्योंकि हम उन फ़ोल्डरों के बारे में परवाह नहीं करते हैं जिनके पास वे मूल्य नहीं हैं। तो हां, मूल रूप से हम कभी सबफ़ोल्डर ढूंढते हैं, और फिर संस्करण या रिलीज़ (किसी एक फ़ोल्डर को या उन दोनों को अनदेखा किए बिना) की तलाश करते हैं।
जयकुल

3
बहुत बढ़िया! मैंने केवल "विंडोज *" प्रविष्टियों को बाहर (?!S)करने के लिए खंड को संशोधित किया है (?![SW])। यह (?=[vCF])केवल उन कुंजियों के साथ भी किया जा सकता है जिनके बारे में हम वास्तव में परवाह करते हैं। वे संस्करण रूट और .NET 4.0+ के लिए "पूर्ण" और "क्लाइंट" कुंजी हैं। ;)
चिरमिसू

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

यदि यह स्थापित है तो यह उत्तर 4.5 नहीं देता है। @ जयकुल से नीचे उत्तर और पुनरावृत्ति का उपयोग करता है।


5
gci 'HKLM: \ SOFTWARE \ Microsoft \ NET फ्रेमवर्क सेटअप \ NDP' | तरह pschildname -des | foreach-object {$ _। नाम; $ _। GetValue ("संस्करण");}
मैटयूबेल

मेरे लिए इसका जवाब अब सबसे ऊपर है, इसलिए इसका लिंक :-): stackoverflow.com/a/3495491/1747983
Tilo

1
Windows 10 पर .NET 4.7.1 स्थापित होने के बाद, यह अभी भी v4.0 देता है।
मैट

24

स्क्रिप्ट में 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" }
      }
    }
}

21
[environment]::Version

आपको VersionCLR के लिए एक उदाहरण देता है PSH की वर्तमान प्रति का उपयोग कर रहा है (जैसा कि यहां दस्तावेज किया गया है )।


3
मेरे पास .NET 4 स्थापित है लेकिन PowerShell केवल 2.0 रनटाइम का उपयोग करेगा। तो यह वास्तव में यहाँ मदद नहीं है।
जॉय

@ जोहान्स: अपने क्यू पर टिप्पणी देखें, आपको इस बारे में स्पष्ट होना चाहिए कि आप क्या चाहते हैं।
रिचर्ड

9
Powershell 2.0 के लिए, आप $PSVersionTableCLR PowerShell का संस्करण ढूंढने के लिए भी उपयोग कर सकते हैं ।
कीथ हिल

6
उच्च संस्करणों के बारे में कैसे? अब मेरे पास .NET 4.7.1 है, और स्क्रिप्ट हमेशा 4.0.30319 Rev. 42000 लौटाती है।
मैट

@ मैट आपको संस्करण के मामूली भाग का अनुवाद करने की आवश्यकता होगी ... और पॉवर्सशेल के कॉन्फ़िगरेशन के भीतर जो सेट किया गया है, उसके आधार पर ध्यान दें कि यह नवीनतम मामूली / पैच संस्करण का उपयोग नहीं हो सकता है।
रिचर्ड

13

सही सिंटैक्स:

[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   

1
मैं win8 पर यह कोशिश की, यह कुछ भी नहीं देता है। विंडोज 7 पर, यह 2 रिटर्न करता है जबकि 4.5.1 पहले से ही स्थापित है। मुझे नहीं पता कि नए प्लेटफार्मों पर यह प्रयोग करने योग्य क्यों नहीं है। 2008 जीतने पर, यह काम करता है।
अधिकतम

पहला विकल्प मेरे विंडोज 8, 64-बिट वातावरण पर काम करता है। दूसरा विकल्प काम करता है, लेकिन मुझे लगता है कि सिर्फ .NET संस्करण दिखाता है कि PowerShell की वर्तमान आवृत्ति चल रही है, जो लगभग हमेशा नवीनतम है। (संपादित करें: शायद वे दोनों करते हैं।)
विम्स

मुझे भी। विंडोज 7 पर, मेरे पास .net 2.0 और 4.0 दोनों हैं, लेकिन कमांड केवल v2.0.50727 दिखाता है। जयकुल के दृष्टिकोण का उपयोग करें।
अधिकतम

Clr वर्जन फ्रेमवर्क वर्जन के बराबर नहीं है, 4+ चौखटे सभी 4 clr पर आधारित हैं
jv88000

उच्च संस्करणों के बारे में कैसे? मैं नेट 4.7.1 अब, और स्क्रिप्ट हमेशा 4.0.30319 रेव 42000. रिटर्न
मैट

11

मैंने इसे ऑक्स के लिए पॉवरशेल में टैब पूरा करने के माध्यम से पाया:

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


1
हां, यह .NET फ्रेमवर्क 4.7.2558.0 लौटाता है - लेकिन 4.7.1 से 4.7 को कैसे अलग किया जा सकता है (मेरे विंडोज 10 पर 4.7.1 है)।
मैट

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

3

एक सरल स्क्रिप्ट का उपयोग करके सभी प्लेटफार्मों और आर्किटेक्चर के लिए ऐसा करने का कोई विश्वसनीय तरीका नहीं है। यदि आप सीखना चाहते हैं कि इसे मज़बूती से कैसे करना है, तो ब्लॉग पोस्ट को शुरू करें। अद्यतित नमूना .NET फ्रेमवर्क डिटेक्शन कोड जो अधिक गहराई से जाँच करता है


2

दूरस्थ वर्कस्टेशन पर कौन से .NET वर्जन इंस्टॉल किए गए हैं, यह जानने के लिए पेज स्क्रिप्ट देखें

नेटवर्क पर एक से अधिक मशीनों के लिए .NET संस्करण खोजने के लिए उपयोगी स्क्रिप्ट हो सकती है।


2

अच्छा समाधान है

डाउनलोड करने योग्य DotNetVersionLister मॉड्यूल (रजिस्ट्री infos और कुछ संस्करण-से-मार्केटिंग-संस्करण लुकअप तालिका के आधार पर) का उपयोग करने का प्रयास करें ।

जो इस तरह से इस्तेमाल किया जाएगा:

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        :

या इस तरह यदि आप इसे कुछ .NET फ्रेमवर्क> = 4. * के लिए परीक्षण करना चाहते हैं :

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

लेकिन यह पीएस v2.0 ( विन 7 , विन सर्वर 2010 ) के साथ काम नहीं करेगा (इंस्टॉल / आयात) असंगतता के कारण मानक) के ...

"विरासत" कार्यों के लिए प्रेरणा नीचे दी गई है

(आप इसे पढ़ना छोड़ सकते हैं और नीचे दिए गए कोड का उपयोग कर सकते हैं)

हमें कुछ मशीनों पर PS 2.0 के साथ काम करना था और उपरोक्त DotNetVersionLister को स्थापित / आयात नहीं कर सकता था ।
अन्य मशीनों पर हम (से अद्यतन करने के लिए चाहता था पुनश्च 2.0 करने के लिए) पी एस 5.1 (जो बारी में की जरूरत है .नेट फ्रेमवर्क> = 4.5 दो कंपनी-रिवाज की मदद से) Install-DotnetLatestCompanyऔर Install-PSLatestCompany
स्थापित / अद्यतन प्रक्रिया के माध्यम से अच्छी तरह से प्रशंसा करने के लिए मार्गदर्शन करने के लिए हमें सभी मशीनों और पीएस संस्करणों पर इन कार्यों में .NET संस्करण का निर्धारण करना होगा।
इस प्रकार हमने सभी वातावरणों में उन्हें अधिक सुरक्षित रूप से निर्धारित करने के लिए नीचे के कार्यों का भी उपयोग किया है ...

विरासत PS वातावरण के लिए कार्य (उदाहरण PS v2.0 )

तो निम्नलिखित कोड और नीचे (निकाले गए) उपयोग उदाहरण यहां उपयोगी हैं (अन्य उत्तरों के आधार पर):

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

उदाहरण उपयोग:

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

@ GoodmegaMan: thx - ऊपर दिए गए उत्तर में अपनी अच्छी सिफारिश को अद्यतन किया :)
एंड्रियास डिट्रिच

1

सुंदर नहीं। निश्चित रूप से सुंदर नहीं:

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

यह काम कर भी सकता है और नहीं भी। लेकिन जहां तक ​​नवीनतम संस्करण का संबंध है, यह बहुत विश्वसनीय होना चाहिए, क्योंकि पुराने संस्करणों (1.0, 1.1) के लिए अनिवार्य रूप से खाली फ़ोल्डर हैं, लेकिन नए नहीं हैं - जो केवल उचित रूपरेखा स्थापित होने के बाद दिखाई देते हैं।

फिर भी, मुझे संदेह है कि एक बेहतर तरीका होना चाहिए।


आपको थोड़ा और फ़िल्टर करने की आवश्यकता है, "V [.0-9] +" को मैच को .NET फ़ोल्डर्स तक सीमित करना चाहिए (मेरे पास कुछ अन्य फ़ोल्डर हैं)। और फिर जांचें कि एक वास्तविक इंस्टॉल है ... स्थापित घटकों पर WMI आसान हो सकता है।
रिचर्ड

हम्म, ठीक है ... इस मशीन पर कुछ अन्य फ़ोल्डर्स भी हैं - मेरे पास मेरी अन्य मशीन पर केवल अन्य फ़ाइलों का एक गुच्छा था। यह पूरा जवाब मेरे लिए »काम करता है» का एक मामला था। मुझे यकीन है कि उस जानकारी को प्राप्त करने का एक विश्वसनीय और इच्छित तरीका है।
जॉय

6
psake (बिल्ड ऑटोमेशन टूल) एक समान दृष्टिकोण लेता है और इसे सफलतापूर्वक उपयोग करता है (या कम से कम किसी ने इसे किसी समस्या के कारण नहीं बदला)। लेकिन यह सच है कि उन्हें पूर्ण फ्रेमवर्क संस्करण की आवश्यकता नहीं है ... मेरे कंप्यूटर के लिए यह करीब हो जाता है:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
5

उत्तरों में सभी वन-लाइनर्स में से, जो स्टेपज द्वारा प्रदान किया गया है, सबसे साफ है और उम्मीद के मुताबिक काम करता है। अगर यह जवाब होता तो मैं इसके लिए मतदान करता।
Bratch

दुर्भाग्य से, यह विश्वसनीय नहीं है। अब मेरे पास .NET 4.7.1 है, और स्क्रिप्ट हमेशा v4.0.30319 लौटाती है।
मैट

0

यदि आपने अपनी मशीन पर विजुअल स्टूडियो स्थापित किया है, तो विजुअल स्टूडियो डेवलपर कमांड प्रॉम्प्ट खोलें और निम्न कमांड टाइप करें: क्लेवर

यह उस मशीन पर .NET फ्रेमवर्क के सभी स्थापित संस्करणों को सूचीबद्ध करेगा।


इस कमांड को CLR वर्जन मिलता है, न कि .NET फ्रेमवर्क वर्जन - जो कि अलग है।
user11909

0

यहाँ इस सवाल पर msft प्रलेखन निम्नलिखित है :

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

यह उदाहरण सभी पॉवरशेल संस्करणों के साथ काम करता है और यह हमेशा के लिए काम करेगा क्योंकि 4.8 अंतिम .NET फ्रेमवर्क संस्करण है।


-1

यहाँ सामान्य विचार है:

.NET फ्रेमवर्क निर्देशिका में बाल आइटम प्राप्त करें जो कंटेनर हैं जिनके नाम पैटर्न वी नंबर डॉट संख्या से मेल खाते हैं । नीचे उतरते हुए नाम से उन्हें क्रमबद्ध करें, पहली वस्तु लें, और उसके नाम की संपत्ति वापस करें।

यहाँ स्क्रिप्ट है:

(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

मैं 4.6.1 स्थापित किया है लेकिन अपनी स्क्रिप्ट रिटर्न v4.0.30319
लूटने

यह मेरी मशीन पर काम नहीं करता है (मेरे पास 4.7.1 स्थापित है)। यह v4.0.30319
मैट

-1

मैं PowerShell में यह एक कोशिश करूंगा: मेरे लिए काम किया!

(Get-ItemProperty "HKLM: सॉफ्टवेयर \ Microsoft \ NET फ्रेमवर्क सेटअप \ NDP \ v4 \ Full" संस्करण।)


यह आपको सच नहीं बताता है। संस्करण संख्या वहाँ कहेगी, उदाहरण के लिए 4.7.03056 जब उत्पाद संस्करण 4.7.2 है
Jaykul

-2

मैं अपने PowerShell सिंटैक्स पर नहीं हूं, लेकिन मुझे लगता है कि आप सिर्फ System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () कॉल कर सकते हैं । यह संस्करण को स्ट्रिंग के रूप में लौटाएगा (कुछ ऐसा v2.0.50727, मुझे लगता है)।


2
वर्तमान में निष्पादित रनटाइम के लिए, जरूरी नहीं कि नवीनतम स्थापित हो।
जॉय

Powerhellhell के लिए, सही सिंटैक्स है:, [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()लेकिन यह सिर्फ v4.0.30319 देता है, भले ही v4.6 मेरे मामले में स्थापित हो।
मैट

@matt 4.0.30319 .Net फ्रेमवर्क 4.0 से .Net फ्रेमवर्क 4.7.1 से सीएलआर संस्करण है। तो आपका v4.6 फ्रेमवर्क वास्तव में 4.0.30319 को इसके CLR संस्करण के रूप में उपयोग करता है। ध्यान दें कि केवल .net फ्रेमवर्क के बीच संस्करण का केवल संशोधन भाग अंतर है। इसे भी देखें: .NET फ्रेमवर्क संस्करण और निर्भरता - Microsoft डॉक्स
वाल्टरलेव

@walterlv - लिंक के लिए धन्यवाद। हां, मुझे इसकी जानकारी है। Microsoft ने ऐसा करने के लिए एक बड़ी गलती की, सर्वर से कनेक्ट करना आसान नहीं है और यह पता लगाना कि कौन सा .net संस्करण वास्तव में वहां स्थापित है। व्यवस्थापक और डेवलपर्स के लिए एक और बड़ा सिरदर्द।
मैट

और यह भी मदद कर सकता है: Microsoft: .NET फ्रेमवर्क के संस्करणों और सर्विस पैक स्तरों का निर्धारण कैसे करें । यह भी दिखाता है कि यह पता लगाना कितना जटिल हो गया कि आपकी मशीन पर वास्तव में क्या स्थापित है ... :-(
मैट

-2

यह पिछली पोस्ट का एक व्युत्पन्न है, लेकिन यह मेरे परीक्षणों में .net फ्रेमवर्क 4 का नवीनतम संस्करण प्राप्त करता है।

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

जो आपको दूरस्थ मशीन पर आने-जाने की अनुमति देगा:

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

जो ADModule और नामकरण सम्मेलन उपसर्ग के साथ इस संभावना को स्थापित करता है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.