Czym byłby skrypt PowerShell, aby zwrócić wersje .NET Framework na komputerze?
Moje pierwsze przypuszczenie dotyczy WMI. Czy jest coś lepszego?
Powinno być jedno-liniowe, aby zwracać tylko najnowszą wersję dla każdej instalacji platformy .NET [w każdym wierszu].
.net
powershell
version
MattUebel
źródło
źródło
asp.net -v
Odpowiedzi:
Jeśli zamierzasz korzystać z rejestru, musisz się powtórzyć, aby uzyskać pełną wersję dla 4.x Framework. Wcześniejsze odpowiedzi zarówno zwracają numer główny w moim systemie dla .NET 3.0 (gdzie numery WCF i WPF, które są zagnieżdżone w 3.0, są wyższe - nie mogę tego wyjaśnić), i nie zwracają niczego dla 4.0. .
EDYCJA: W przypadku wersji .Net 4.5 i nowszych sytuacja nieco się zmieniła, więc jest tutaj ładny artykuł MSDN wyjaśniający, jak przekonwertować wartość Release na numer wersji .Net, jest to całkowity wrak pociągu :-(
To wygląda mi dobrze (zauważ, że wyświetla osobne numery wersji dla WCF i WPF w 3.0. Nie wiem o co chodzi). Wyprowadza także zarówno Klient, jak i Pełny w wersji 4.0 (jeśli masz je obie zainstalowane):
Na podstawie artykułu MSDN można zbudować tabelę wyszukiwania i zwrócić numer wersji produktu marketingowego dla wydań po 4.5:
W rzeczywistości, ponieważ wciąż muszę aktualizować tę odpowiedź, oto skrypt do wygenerowania powyższego skryptu (z dodatkowymi dodatkami) ze źródła Markdown dla tej strony internetowej. Prawdopodobnie w pewnym momencie się zepsuje, więc trzymam obecną kopię powyżej.
źródło
'^(?!S)\p{L}'
wyrażenia regularnego, i otrzymuje informacje o wersji i wydaniu. Czym dokładnie jest to wyrażenie regularne, które się kwalifikuje?PSChildName
to nazwa liścia klucza rejestru.\p{L}
to dowolny znak w kategorii „litera” w Unicode.(?!S)
jest negatywnym rozejrzeniem się i^
jest początkiem ciągu. Więc musi zaczynać się od litery innej niżS
. Więc jeśli weźmiesz pod uwagę tylko ASCII, jest to to samo co$_.PSChildName -cmatch '^[A-RT-Za-z]'
(zwróć uwagę na-cmatch
). Znajduje więc klucze, których nazwa zaczyna się na literę inną niżS
. Nie mam pojęcia, dlaczego miałbyś przejmować się nie-ASCII, jeśli odfiltrowujesz nazwy zaczynające się odS
... Zdecydowanie, ponieważ jest to tak mylące.Get-ItemProperty -name Version,Release -EA 0
robi. Wiem, że-EA 0
jest taki sam-ErrorAction SilentlyContinue
, ale jaki efekt miałbyGet-ItemProperty -name Version,Release
przy przekazywaniu do niego wszystkich wyników? Wydaje się, że nie usuwa żadnych zmiennych z obiektu, ponieważ inne są używane w późniejszych poleceniach potoku. Czy to działa, występuje błąd, gdy w kluczu brakuje nazwyVersion
lubRelease
, a następnie przekazuje obiekty, w których się udało, do następnego polecenia w potoku?(?!S)
klauzulę, aby(?![SW])
dodatkowo wykluczać wpisy „Windows *”. Można to również zrobić,(?=[vCF])
ponieważ jedynymi kluczami, na których nam naprawdę zależy, są katalogi główne wersji oraz klucze „Full” i „Client” dla .NET 4.0+. ;)Ta odpowiedź nie zwraca 4.5, jeśli jest zainstalowana. Odpowiedź poniżej z @Jaykul i używanie rekurencji.
źródło
Dodano obsługę skryptu v4.8:
źródło
Daje instancję
Version
CLR, której używa bieżąca kopia PSH (zgodnie z dokumentacją tutaj ).źródło
$PSVersionTable
do znalezienia wersji programu CLR PowerShell.Prawidłowa składnia:
GetSystemVersion
Funkcja zwraca ciąg znaków takich jak to:lub tak
$PSVersionTable
jest obiektem tylko do odczytu. Właściwość CLRVersion jest strukturalnym numerem wersji, takim jak ten:źródło
Znalazłem to poprzez uzupełnienie tabulacji w PowerShell dla OSX:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
źródło
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Nie ma niezawodnego sposobu na zrobienie tego dla wszystkich platform i architektur za pomocą prostego skryptu. Jeśli chcesz dowiedzieć się, jak to zrobić niezawodnie, zacznij od wpisu na blogu Zaktualizowany przykładowy kod wykrywający .NET Framework, który zapewnia bardziej dogłębne sprawdzanie .
źródło
Sprawdź na stronie Skrypt, które wersje .NET są zainstalowane na zdalnych stacjach roboczych .
Tam skrypt może być przydatny do znalezienia wersji .NET dla wielu komputerów w sieci.
źródło
Niezłe rozwiązanie
Spróbuj użyć modułu DotNetVersionLister do pobrania (na podstawie informacji z rejestru i tabeli wyszukiwania wersji od wersji marketingowej).
Który byłby użyty w ten sposób:
Lub w ten sposób, jeśli chcesz go przetestować pod kątem .NET Framework> = 4. * :
Ale to nie będzie działać (instalacja / import) np. Z PS v2.0 ( Win 7 , standard Win Server 2010 ) z powodu niezgodności ...
Motywacja do „starszych” funkcji poniżej
(Możesz pominąć czytanie i użyć kodu poniżej)
Musieliśmy pracować z PS 2.0 na niektórych komputerach i nie mogliśmy zainstalować / zaimportować powyższego DotNetVersionLister .
Na innych komputerach chcieliśmy zaktualizować (z PS 2.0 ) do PS 5.1 (co z kolei wymaga .NET Framework> = 4.5 ) przy pomocy dwóch niestandardowych programów
Install-DotnetLatestCompany
iInstall-PSLatestCompany
.Aby ładnie przeprowadzić administratorów przez proces instalacji / aktualizacji, musielibyśmy określić wersję .NET w tych funkcjach na wszystkich istniejących komputerach i wersjach PS.
Dlatego użyliśmy również poniższych funkcji, aby określić je bezpieczniej we wszystkich środowiskach ...
Funkcje starszych środowisk PS (np. PS v2.0 )
Zatem poniższy kod i poniższe (wyodrębnione) przykłady użycia są przydatne tutaj (na podstawie innych odpowiedzi tutaj):
Przykładowe użycie:
źródło
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Nie ładna Zdecydowanie nie ładna:
To może, ale nie musi działać. Jednak w przypadku najnowszej wersji powinno to być dość niezawodne, ponieważ są zasadniczo puste foldery dla starych wersji (1.0, 1.1), ale nie nowsze - te pojawiają się dopiero po zainstalowaniu odpowiedniego frameworka.
Mimo to podejrzewam, że musi być lepszy sposób.
źródło
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Jeśli masz zainstalowany program Visual Studio na swoim komputerze, otwórz wiersz polecenia programu Visual Studio Developer i wpisz następujące polecenie: clrver
Wyświetli listę wszystkich zainstalowanych wersji .NET Framework na tym komputerze.
źródło
Oto moje zdanie na temat tego pytania zgodnie z dokumentacją msft :
Ten przykład działa ze wszystkimi wersjami PowerShell i będzie działał bez końca, ponieważ 4.8 jest ostatnią wersją .NET Framework.
źródło
Oto ogólny pomysł:
Pobierz elementy podrzędne w katalogu .NET Framework, które są kontenerami, których nazwy pasują do wzorca v numer kropki numer . Posortuj je według malejącej nazwy, weź pierwszy obiekt i zwróć jego właściwość name.
Oto skrypt:
źródło
Chciałbym spróbować tego w PowerShell: Pracowałem dla mnie!
(Get-ItemProperty "HKLM: Software \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Wersja
źródło
Nie jestem przy mojej składni PowerShell, ale myślę, że możesz po prostu wywołać System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Zwróci to wersję jako ciąg znaków (coś, jak
v2.0.50727
myślę).źródło
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
:, ale zwraca tylko v4.0.30319, mimo że v4.6 jest zainstalowane w moim przypadku.Jest to pochodna poprzedniego postu, ale w moich testach otrzymuję najnowszą wersję .NET Framework 4.
Który pozwoli ci na wywołanie polecenia na zdalnym komputerze:
Który ustawia tę możliwość z ADModule i prefiksem konwencji nazewnictwa:
źródło