পাওয়ারশেল স্ক্রিপ্টটি কোনও মেশিনে .NET ফ্রেমওয়ার্কের সংস্করণগুলি ফিরিয়ে আনবে?


182

কোনও মেশিনে .NET ফ্রেমওয়ার্কের সংস্করণগুলি ফিরিয়ে আনার জন্য পাওয়ারশেল স্ক্রিপ্টটি কী হবে?

আমার প্রথম অনুমানটি ডাব্লুএমআই-এর সাথে জড়িত something এর চেয়ে ভাল কিছু আছে কি?

NET [প্রতিটি লাইনে] প্রতিটি স্থাপনার জন্য কেবল সর্বশেষতম সংস্করণটি ফিরিয়ে আনতে এটি এক-লাইনার হওয়া উচিত।


7
কোনও মেশিনে এফএক্সের একাধিক সংস্করণ থাকতে পারে (এবং হবে) । আপনি কিভাবে এটি পরিচালনা করতে চান? এবং তারপরে Fx2 আছে .. Fx3.5SP1 জগাখিচুড়ি। আপনি কোন সংস্করণ শুনতে চান?
হেন্ক হলটারম্যান

আমি মনে করি প্রতিটি ইনস্টলের জন্য পুরো সংস্করণ নম্বরটি ফেরত দেওয়া প্রয়োজন হবে।
ম্যাটউবেল

1
ডাব্লুএমআইয়ের মাধ্যমে এটি করার কোনও উপায় নেই?
মার্ক রিচম্যান

আপনি পাওয়ারশেলের জন্য বলেছেন, আমি সি # (কনসোল অ্যাপ্লিকেশন) এর জন্য কিছু তৈরি করেছি। আপনি যদি আগ্রহী হন তবে এখানে ...
ম্যাট

এটি সত্যিই অবিশ্বাস্য যে এর মতো কিছু নেই:asp.net -v
অল্টিমাস প্রাইম

উত্তর:


353

যদি আপনি রেজিস্ট্রি ব্যবহার করতে চলেছেন তবে আপনাকে 4.x ফ্রেমওয়ার্কের সম্পূর্ণ সংস্করণ পেতে পুনরাবৃত্তি করতে হবে। পূর্ববর্তী উত্তরগুলি উভয়ই আমার সিস্টেমের নেট নেট 3.0.০ (যেখানে ডাব্লুসিএফ এবং ডাব্লুপিএফ সংখ্যাগুলি 3.0.০ এর নীচে বাসা বেঁধে দেওয়া হয়, উচ্চতর - আমি এটি ব্যাখ্যা করতে পারি না), এবং 4.0 এর জন্য কিছু ফেরত দিতে ব্যর্থ হয়েছি! ।

সম্পাদনা করুন: নেট .৪.৫ এবং তার বেশি জন্য, এটি আবার কিছুটা পরিবর্তিত হয়েছে, সুতরাং এখানে একটি দুর্দান্ত এমএসডিএন নিবন্ধ রয়েছে যে কীভাবে রিলিজের মানটিকে একটি। নেট সংস্করণ সংখ্যায় রূপান্তর করতে হবে তা ব্যাখ্যা করে , এটি মোট ট্রেনের নষ্ট :-(

এটি আমার কাছে ঠিক দেখাচ্ছে (নোট করুন যে এটি ডাব্লুসিএফ এবং ডাব্লুপিএফের জন্য পৃথক সংস্করণ নম্বরগুলি 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

এমএসডিএন নিবন্ধের ভিত্তিতে, আপনি একটি অনুসন্ধানের টেবিল তৈরি করতে পারেন এবং 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}ইউনিকোড বিভাগের "অক্ষর" এর যে কোনও চরিত্র character (?!S)চারদিকে একটি নেতিবাচক চেহারা এবং ^স্ট্রিংয়ের শুরু। সুতরাং এটি ছাড়া অন্য একটি চিঠি দিয়ে শুরু করতে হবে S। সুতরাং আপনি যদি কেবল এএসসিআইআই বিবেচনা করেন তবে এটি $_.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
গেট-চাইল্ড আইটেম সমস্ত রেজিস্ট্রি সাবকিগুলি (সাবফোল্ডারগুলি, যদি আপনি চান তবে) প্রদান করে। গেট-আইটেমপ্রপার্টি মানগুলি ফিরিয়ে দেয় (বিশেষত: "সংস্করণ" এবং "রিলিজ") - আমরা ত্রুটিগুলি উপেক্ষা করি কারণ আমরা যে ফোল্ডারগুলিতে সেই মানগুলি নেই সেগুলি যত্ন করে না। সুতরাং হ্যাঁ, মূলত আমরা প্রত্যেকটি সাবফোল্ডার খুঁজে পাই এবং তারপরে সংস্করণ বা প্রকাশের সন্ধান করি (যার মধ্যে একটি বা উভয়ই ফোল্ডার উপেক্ষা করা হয় না)।
জয়কুল

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 ফিরে আসে না doesn't নীচে উত্তর @ জয়কুল থেকে এবং পুনরাবৃত্তি ব্যবহার করে।


5
gci 'এইচকেএলএম: OF সফটওয়্যার \ মাইক্রোসফ্ট \ নেট ফ্রেমওয়ার্ক সেটআপ \ এনডিপি' | বাছাই করুন pschildname -des | foreach- অবজেক্ট {$ _। নাম; $ _। গেটভ্যালু ("সংস্করণ");}
ম্যাটউবেল

আমার জন্য উত্তর এখন শীর্ষে তাই এর লিঙ্কটি এখানে :-): stackoverflow.com/a/3495491/1747983
টিলো

1
উইন্ডোজ 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

Versionসিএলআর- এর জন্য আপনাকে পিএসএইচের বর্তমান অনুলিপিটি ব্যবহার করছে ( এখানে ডকুমেন্টেড হিসাবে ) একটি উদাহরণ দেয় ।


3
আমার .NET 4 ইনস্টল করা আছে তবে পাওয়ারশেলটি কেবল 2.0 রানটাইম ব্যবহার করবে। সুতরাং এটি এখানে আসলেই সহায়তার নয়।
জোয়

@ জোহানেস: আপনার প্রশ্নে মন্তব্য দেখুন, আপনি যা চান তা সম্পর্কে আপনাকে সুস্পষ্ট হওয়া দরকার।
রিচার্ড

9
$PSVersionTableপাওয়ারশেল ২.০ এর জন্য, আপনি সিএলআর পাওয়ারশেলের সংস্করণ চালু আছে তা খুঁজে পেতেও ব্যবহার করতে পারেন ।
কিথ হিল

6
উচ্চতর সংস্করণগুলি কেমন? আমি .NET 4.7.1 এখন, এবং স্ক্রিপ্ট সবসময় 4.0.30319 রেভারেন্ড 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একমাত্র পঠনযোগ্য বস্তু। সিএলআরভিশন সম্পত্তি এটির মতো একটি কাঠামোগত সংস্করণ নম্বর:

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

1
আমি win8 এ চেষ্টা করেছিলাম, এটি কিছুই দেয় না। উইন্ডোজ On-তে, এটি 2 ফেরত আসে যখন 4.5.5 ইতিমধ্যে ইনস্টল করা আছে। নতুন প্ল্যাটফর্মগুলিতে কেন এটি ব্যবহারযোগ্য নয় তা আমি জানি না। বিজয়ী Sesrver 2008 এ, এটি কাজ করে।
সর্বাধিক

প্রথম বিকল্পটি আমার উইন্ডোজ 8, 64-বিট পরিবেশে কাজ করে। দ্বিতীয় বিকল্পটি কাজ করে, তবে আমি মনে করি যে বিদ্যুতের বর্তমান সংস্করণটি চলছে এমনটি নেট সংস্করণটি কেবল দেখায় যা প্রায় সর্বদা সর্বশেষ। (সম্পাদনা করুন: তারা উভয়ই করতে পারে))
ভিমস 21

একই অবস্থা. উইন্ডোজ on-এ, আমার। নেট 2.0 এবং 4.0 উভয়ই রয়েছে তবে কমান্ডটি কেবল v2.0.50727 দেখায়। জয়কুলের পদ্ধতির ব্যবহার করুন।
সর্বোচ্চ

সিআরআর সংস্করণ ফ্রেমওয়ার্ক সংস্করণের সমান নয়, 4+ ফ্রেমওয়ার্কগুলি সমস্ত 4 টি ক্লার উপর ভিত্তি করে
janv8000

উচ্চতর সংস্করণগুলি কেমন? আমি .NET 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

একটি সাধারণ স্ক্রিপ্ট ব্যবহার করে সমস্ত প্ল্যাটফর্ম এবং আর্কিটেকচারের জন্য এটি করার কোনও নির্ভরযোগ্য উপায় নেই। তুমি কেমন নির্ভরযোগ্যভাবে এটা করতে জানতে চান, ব্লগ পোস্ট এ শুরু Updated নমুনা .NET ফ্রেমওয়ার্ক সনাক্তকরণ কোডটি আরো মধ্যে গভীরতা পরীক্ষণ করে


2

দূরবর্তী ওয়ার্কস্টেশনগুলিতে কোন .NET সংস্করণ ইনস্টল করা আছে তা সন্ধানের জন্য পৃষ্ঠা স্ক্রিপ্টটি দেখুন

কোনও স্ক্রিপ্ট কোনও নেটওয়ার্কে একাধিক মেশিনের জন্য .NET সংস্করণ সন্ধান করতে কার্যকর হতে পারে।


2

সুন্দর সমাধান

ডাউনলোডযোগ্য ডটনেট ভার্সনলিস্টর মডিউলটি ব্যবহার করার চেষ্টা করুন (রেজিস্ট্রি ইনফস এবং কিছু সংস্করণ থেকে বিপণন-সংস্করণ দেখার সারণীর উপর ভিত্তি করে)।

যা এর মতো ব্যবহৃত হবে:

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 Framework> = 4. * :

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

তবে এটি অসম্পূর্ণতার কারণে PS v2.0 ( উইন 7 , উইন সার্ভার 2010 স্ট্যান্ডার্ড) সহ (ইনস্টল / আমদানি) কাজ করবে না ...

নীচে "উত্তরাধিকার" ফাংশনগুলির জন্য অনুপ্রেরণা

(আপনি এটি পড়তে পারেন এবং নীচের কোডটি ব্যবহার করতে পারেন)

আমাদের কিছু মেশিনে পিএস 2.0 এর সাথে কাজ করতে হয়েছিল এবং উপরের ডটনেট ভার্সনলিস্টারটি ইনস্টল / আমদানি করতে পারিনি
অন্য মেশিনে আমরা (থেকে আপডেট করতে চেয়েছিলেন দ্রষ্টব্য 2.0 পর্যন্ত) দ্রষ্টব্য 5.1 (যা পালাক্রমে প্রয়োজন .NET ফ্রেমওয়ার্ক> = 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"
21:44 এ ΩmegaMan

@ Ωমেগামান: থেক্স - উপরের উত্তরে আপনার ভাল সুপারিশটি আপডেট করেছে :)
আন্দ্রেয়াস

1

না সুন্দর. অবশ্যই সুন্দর নয়:

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

এটি নাও কাজ করতে পারে। তবে সর্বশেষতম সংস্করণটি যথাসম্ভব নির্ভরযোগ্য হওয়া উচিত, কারণ পুরানো সংস্করণগুলির জন্য মূলত খালি ফোল্ডারগুলি রয়েছে (1.0, 1.1) তবে নতুন নয় - উপযুক্ত কাঠামো ইনস্টল হওয়ার পরে সেগুলি কেবল উপস্থিত হয়।

তবুও, আমি সন্দেহ করি এর থেকে আরও ভাল উপায় অবশ্যই আছে।


আপনাকে আরও কিছুটা ফিল্টার করতে হবে, "ভি [.0-9] +" ম্যাচটি .NET ফোল্ডারে সীমাবদ্ধ করা উচিত (আমার সেখানে আরও কিছু ফোল্ডার রয়েছে)। এবং তারপরে একটি আসল ইনস্টল আছে কিনা তা পরীক্ষা করুন ... ইনস্টল করা উপাদানগুলিতে ডাব্লুএমআই আরও সহজ হতে পারে।
রিচার্ড

এইচএম, ঠিক আছে ... এই মেশিনে আরও কয়েকটি ফোল্ডার রয়েছে - আমার অন্য মেশিনে আমার কাছে কেবল আরও একগুচ্ছ ফাইল ছিল। যদিও এই পুরো উত্তরটি আমার পক্ষে কাজ করে of আমি নিশ্চিত যে তথ্যটি পাওয়ার একটি নির্ভরযোগ্য এবং উদ্দেশ্যপূর্ণ উপায় রয়েছে।
জোয়

6
সোজা (বিল্ড অটোমেশন সরঞ্জাম) অনুরূপ পন্থা গ্রহণ করে এবং এটি সফলভাবে ব্যবহার করে (বা কমপক্ষে কোনও সমস্যার কারণে এটি এটিকে পরিবর্তন করেনি)। তবে এটি সত্য যে তাদের পূর্ণ ফ্রেমওয়ার্ক সংস্করণের দরকার নেই ... আমার কম্পিউটারের জন্য এটি আরও কাছে আসে:ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
স্টেজ

উত্তরের সমস্ত ওয়ান-লাইনারের মধ্যে, স্ট্জের সরবরাহকৃতটি সবচেয়ে পরিষ্কার এবং প্রত্যাশার মতো কাজ করে। যদি উত্তর হয় আমি এটির পক্ষে ভোট দিতাম।
ব্রাচ

দুর্ভাগ্যক্রমে, এটি নির্ভরযোগ্য নয়। আমার কাছে এখন .NET 4.7.1 আছে এবং স্ক্রিপ্টটি সর্বদা v4.0.30319 প্রদান করে।
ম্যাট

0

আপনি যদি নিজের মেশিনে ভিজ্যুয়াল স্টুডিও ইনস্টল করেন তবে ভিজ্যুয়াল স্টুডিও বিকাশকারী কমান্ড প্রম্পটটি খুলুন এবং নিম্নলিখিত কমান্ডটি টাইপ করুন: ক্লার্ভার

এটি সেই মেশিনে .NET ফ্রেমওয়ার্কের সমস্ত ইনস্টল করা সংস্করণ তালিকাভুক্ত করবে।


এই কমান্ডটি সিএনআর সংস্করণ পেয়েছে, .NET ফ্রেমওয়ার্ক সংস্করণ নয় - যা আলাদা।
ব্যবহারকারী 11909

0

এমএসএফ্ট ডকুমেন্টেশন অনুসরণ করে এই প্রশ্নটি এখানে রাখছি :

$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 শেষ। নেট ফ্রেমওয়ার্ক সংস্করণ।


-1

সাধারণ ধারণাটি এখানে:

.NET ফ্রেমওয়ার্ক ডিরেক্টরিতে শিশু আইটেমগুলি পান যা পাত্রে যাঁর নাম প্যাটার্ন v নম্বর ডট সংখ্যার সাথে মেলে । নামটি নামিয়ে বাছাই করুন, প্রথম বস্তুটি নিন এবং এর নামের সম্পত্তিটি ফিরিয়ে দিন।

লিপিটি এখানে:

(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

আমি পাওয়ারশেলের মধ্যে এটি চেষ্টা করব: আমার জন্য কাজ করেছেন!

(গেট-আইটেমপ্রোপার্টি "এইচকেএলএম: সফ্টওয়্যার \ মাইক্রোসফ্ট \ নেট ফ্রেমওয়ার্ক সেটআপ \ এনডিপি \ v4 \ পূর্ণ") সংস্করণ


এটি আপনাকে সত্য বলে দেয় না। সংস্করণ সংখ্যা সেখানে উদাহরণস্বরূপ 4.7.03056 জন্য বলবে, পণ্য সংস্করণ 4.7.2 যখন
Jaykul

-2

আমি আমার পাওয়ারশেল সিনট্যাক্সটিতে নেই, তবে আমি মনে করি আপনি কেবলমাত্র সিস্টেম.রুনটাইম.ইন্টার্পোস সার্ভিসেস.রুনটাইম এনভায়রনমেন্ট.গেটস সিস্টেম ভার্শন () কল করতে পারেন । এটি সংস্করণটিকে স্ট্রিং হিসাবে ফিরিয়ে দেবে (এমন কিছু v2.0.50727মনে হয়)।


2
বর্তমানে সঞ্চালিত রানটাইমের জন্য, অগত্যা সর্বশেষতম ইনস্টল করা প্রয়োজন।
জোয়

পাওয়ারশেলের জন্য, সঠিক বাক্য গঠনটি হ'ল: [System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()তবে এটি v4.0.30319 কেবল ফেরত দেয়, যদিও v4.6 আমার ক্ষেত্রে ইনস্টল করা আছে।
ম্যাট

@ মেট্ট 4.0.30319। নেট ফ্রেমওয়ার্ক 4.0 থেকে নেট ফ্রেমওয়ার্ক 4.7.1 এর সিএলআর সংস্করণ। সুতরাং আপনার v4.6 ফ্রেমওয়ার্কটি আসলে তার সিএলআর সংস্করণ হিসাবে 4.0.30319 ব্যবহার করে। লক্ষ্য করুন যে সংস্করণটির কেবলমাত্র সংশোধনী অংশটি সমস্ত। নেট ফ্রেমওয়ার্কের মধ্যে পার্থক্য। আরও দেখুন: .NET ফ্রেমওয়ার্ক সংস্করণ এবং নির্ভরতা - মাইক্রোসফ্ট ডক্স
ওয়ালটারলভ

@ ওয়াল্টারলভ - লিঙ্কটির জন্য আপনাকে ধন্যবাদ। হ্যাঁ, আমি এটি সম্পর্কে সচেতন। মাইক্রোসফ্ট এটি করতে একটি বড় ভুল করেছে, কোনও সার্ভারের সাথে রিমোট সংযোগ স্থাপন করা এবং কোন। নেট সংস্করণটি আসলে সেখানে ইনস্টল করা আছে তা সন্ধান করা সহজ নয়। প্রশাসক এবং বিকাশকারীদের জন্য আরও একটি বড় মাথা ব্যাথা।
ম্যাট

এবং এটি পাশাপাশি সহায়তা করতে পারে: মাইক্রোসফ্ট: .NET ফ্রেমওয়ার্কের সংস্করণ এবং পরিষেবা প্যাকের স্তর কীভাবে নির্ধারণ করবেন । এটি আপনার মেশিনে ঠিক কী ইনস্টল করা হয়েছে তা খুঁজে বের করা কতটা জটিল হয়েছিল তাও দেখায় ... :-(
ম্যাট

-2

এটি পূর্ববর্তী পোস্টের ডেরাইভাইট, তবে এটি আমার পরীক্ষায়। নেট ফ্রেমওয়ার্ক 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.