Apa yang akan menjadi skrip PowerShell untuk mengembalikan versi .NET Framework pada mesin?
Tebakan pertama saya adalah sesuatu yang melibatkan WMI. Apakah ada sesuatu yang lebih baik?
Seharusnya hanya satu baris untuk mengembalikan hanya versi terbaru untuk setiap instalasi .NET [pada setiap baris].
.net
powershell
version
MattUebel
sumber
sumber
asp.net -v
Jawaban:
Jika Anda akan menggunakan registri Anda harus berulang untuk mendapatkan versi lengkap untuk 4.x Framework. Jawaban sebelumnya keduanya mengembalikan nomor root pada sistem saya untuk .NET 3.0 (di mana nomor WCF dan WPF, yang bersarang di bawah 3.0, lebih tinggi - saya tidak bisa menjelaskannya), dan gagal mengembalikan apa pun untuk 4.0 .. .
EDIT: Untuk .Net 4.5 ke atas, ini berubah sedikit lagi, jadi sekarang ada artikel MSDN yang bagus di sini yang menjelaskan cara mengonversi nilai Rilis ke nomor versi .Net, ini kecelakaan total kereta :-(
Ini terlihat benar bagi saya (perhatikan bahwa ini mengeluarkan nomor versi terpisah untuk WCF & WPF pada 3.0. Saya tidak tahu tentang apa itu). Ini juga menampilkan Klien dan Penuh pada 4.0 (jika Anda memiliki keduanya diinstal):
Berdasarkan artikel MSDN, Anda bisa membuat tabel pencarian dan mengembalikan nomor versi produk pemasaran untuk rilis setelah 4.5:
Bahkan, karena saya terus memperbarui jawaban ini, inilah skrip untuk menghasilkan skrip di atas (dengan sedikit tambahan) dari sumber penurunan harga untuk halaman web itu. Ini mungkin akan rusak di beberapa titik, jadi saya menyimpan salinan saat ini di atas.
sumber
'^(?!S)\p{L}'
regex dan mendapatkan informasi Versi dan Rilis. Apa tepatnya ekspresi reguler yang berusaha memenuhi syarat?PSChildName
adalah nama daun dari kunci registri.\p{L}
adalah karakter apa pun dalam "huruf" kategori Unicode.(?!S)
adalah pandangan negatif di sekitar, dan^
merupakan awal dari string. Jadi harus dimulai dengan surat selainS
. Jadi, jika Anda hanya mempertimbangkan ASCII, itu sama dengan$_.PSChildName -cmatch '^[A-RT-Za-z]'
(perhatikan-cmatch
). Jadi ia menemukan kunci di mana nama dimulai dengan huruf selainS
. Saya tidak tahu mengapa Anda akan peduli dengan non-ASCII jika Anda memfilter nama yang dimulai denganS
... Pasti Anda terlalu bingung.Get-ItemProperty -name Version,Release -EA 0
sedang dilakukan. Saya tahu-EA 0
ini sama dengan-ErrorAction SilentlyContinue
, tetapi apa efek yang akanGet-ItemProperty -name Version,Release
terjadi ketika mengirim semua hasil ke sana? Tampaknya tidak menghapus variabel apa pun dari objek, karena yang lain digunakan dalam perintah kemudian dalam pipa. Apakah itu berjalan, kesalahan ketika namaVersion
atauRelease
hilang dari kunci, dan kemudian melewati objek di mana ia berhasil masuk ke perintah berikutnya di dalam pipa?(?!S)
klausa untuk lebih(?![SW])
lanjut mengecualikan entri "Windows *". Ini juga dapat dilakukan dengan(?=[vCF])
karena satu-satunya kunci yang benar-benar kita pedulikan adalah akar Versi dan kunci "Penuh" dan "Klien" untuk .NET 4.0+. ;)Jawaban ini tidak mengembalikan 4,5 jika itu diinstal. Jawaban di bawah ini dari @Jaykul dan menggunakan recurse tidak.
sumber
Menambahkan dukungan v4.8 ke skrip:
sumber
Memberi Anda sebuah contoh
Version
untuk CLR salinan PSH saat ini menggunakan (seperti yang didokumentasikan di sini ).sumber
$PSVersionTable
untuk menemukan versi CLR PowerShell sedang berjalan.Sintaks yang benar:
The
GetSystemVersion
mengembalikan fungsi string seperti ini:atau seperti ini
$PSVersionTable
adalah objek hanya baca. Properti CLRVersion adalah nomor versi terstruktur seperti ini:sumber
Saya menemukan ini melalui penyelesaian tab di PowerShell untuk OSX:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
sumber
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Tidak ada cara yang dapat diandalkan untuk melakukan ini untuk semua platform dan arsitektur menggunakan skrip sederhana. Jika Anda ingin mempelajari cara melakukannya dengan andal, mulailah di blog post Diperbarui sampel. Kode deteksi NET Framework yang melakukan pemeriksaan lebih mendalam .
sumber
Lihat skrip halaman untuk menemukan versi .NET yang diinstal pada workstation jarak jauh .
Skrip di sana mungkin berguna untuk menemukan versi .NET untuk beberapa mesin di jaringan.
sumber
Solusi bagus
Coba gunakan modul DotNetVersionLister yang dapat diunduh (berdasarkan info registri dan beberapa tabel pencarian versi ke pemasaran).
Yang akan digunakan seperti ini:
Atau seperti ini jika Anda hanya ingin mengujinya untuk beberapa kerangka .NET> = 4. * :
Tapi itu tidak akan berfungsi (instal / impor) misalnya dengan PS v2.0 ( Win 7 , Win Server 2010 standar) karena ketidakcocokan ...
Motivasi untuk fungsi "warisan" di bawah
(Anda dapat melewati membaca ini dan menggunakan kode di bawah ini)
Kami harus bekerja dengan PS 2.0 pada beberapa mesin dan tidak dapat menginstal / mengimpor DotNetVersionLister di atas .
Pada mesin lain kami ingin memperbarui (dari PS 2.0 ) ke PS 5.1 (yang pada gilirannya membutuhkan .NET Framework> = 4.5 ) dengan bantuan dua custom-company
Install-DotnetLatestCompany
danInstall-PSLatestCompany
.Untuk memandu admin dengan baik melalui proses instalasi / pembaruan, kami harus menentukan versi .NET di fungsi-fungsi ini pada semua mesin dan versi PS yang ada.
Jadi kami juga menggunakan fungsi di bawah ini untuk menentukan mereka lebih aman di semua lingkungan ...
Fungsi untuk lingkungan PS lawas (mis. PS v2.0 )
Jadi kode berikut dan di bawah ini (diekstraksi) contoh penggunaan berguna di sini (berdasarkan jawaban lain di sini):
Contoh penggunaan:
sumber
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Tidak cantik. Jelas tidak cantik:
Ini mungkin atau mungkin tidak berhasil. Tetapi sejauh menyangkut versi terbaru, ini seharusnya cukup andal, karena pada dasarnya ada folder kosong untuk versi lama (1.0, 1.1) tetapi tidak yang lebih baru - yang hanya muncul setelah kerangka kerja yang sesuai diinstal.
Meski begitu, saya curiga pasti ada cara yang lebih baik.
sumber
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Jika Anda telah menginstal Visual Studio pada mesin Anda kemudian buka Prompt Perintah Pengembang Visual Studio dan ketik perintah berikut: clrver
Ini akan mencantumkan semua versi .NET Framework yang diinstal pada mesin itu.
sumber
Inilah pendapat saya tentang pertanyaan ini setelah dokumentasi msft :
Contoh ini berfungsi dengan semua versi PowerShell dan akan bekerja selamanya karena 4.8 adalah versi .NET Framework terakhir.
sumber
Inilah gagasan umum:
Dapatkan item turunan dalam direktori .NET Framework yang merupakan wadah yang namanya cocok dengan pola nomor dot nomor v . Urutkan berdasarkan nama menurun, ambil objek pertama, dan kembalikan properti namanya.
Ini skripnya:
sumber
Saya akan mencoba yang ini di PowerShell: Bekerja untuk saya!
(Get-ItemProperty "HKLM: Perangkat Lunak \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Versi
sumber
Saya tidak mengerti sintaks PowerShell saya, tapi saya pikir Anda bisa memanggil System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Ini akan mengembalikan versi sebagai string (sesuatu seperti
v2.0.50727
, saya pikir).sumber
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
:, tetapi hanya mengembalikan v4.0.30319, meskipun v4.6 diinstal dalam kasus saya.Ini adalah turunan dari posting sebelumnya, tetapi ini mendapatkan versi terbaru dari .net framework 4 dalam pengujian saya.
Yang akan memungkinkan Anda untuk memanggil-perintah ke mesin jarak jauh:
Yang mengatur kemungkinan ini dengan ADModule dan awalan konvensi penamaan:
sumber