Что такое сценарий PowerShell для возврата версий .NET Framework на компьютере?
Мое первое предположение - это что-то, связанное с WMI. Есть ли что-то лучше?
Это должен быть однострочник, чтобы возвращать только последнюю версию для каждой установки .NET [в каждой строке].
.net
powershell
version
MattUebel
источник
источник
asp.net -v
Ответы:
Если вы собираетесь использовать реестр, вам нужно выполнить рекурсию, чтобы получить полную версию для 4.x Framework. Предыдущие ответы оба возвращают номер root в моей системе для .NET 3.0 (где номера WCF и WPF, вложенные в 3.0, выше - я не могу этого объяснить) и не возвращают ничего для 4.0 .. ,
РЕДАКТИРОВАТЬ: Для .Net 4.5 и выше, это снова немного изменилось, так что теперь есть хорошая статья MSDN, объясняющая, как преобразовать значение Release в номер версии .Net, это полный крушение поезда :-(
Это выглядит правильно для меня (обратите внимание, что он выводит отдельные номера версий для WCF и WPF на 3.0. Я не знаю, о чем это). Он также выводит как Client, так и Full на 4.0 (если они оба установлены):
Основываясь на статье MSDN, вы можете создать справочную таблицу и вернуть номер версии маркетингового продукта для выпусков после 4.5:
Фактически, поскольку мне постоянно приходится обновлять этот ответ, вот скрипт для генерации сценария выше (с небольшим дополнительным дополнением) из источника уценки для этой веб-страницы. Это, вероятно, сломается в какой-то момент, поэтому я сохраняю текущую копию выше.
источник
'^(?!S)\p{L}'
регулярному выражению, и получение информации о версии и выпуске. Что именно это регулярное выражение пытается определить?PSChildName
- это конечное имя раздела реестра.\p{L}
это любой символ в категории Unicode «буква».(?!S)
является отрицательным взглядом вокруг, и^
является началом строки. Так что это должно начинаться с буквы, отличной отS
. Так что если вы рассматриваете только ASCII, это то же самое, что$_.PSChildName -cmatch '^[A-RT-Za-z]'
(обратите внимание на-cmatch
). Таким образом, он находит ключи, где имя начинается с буквы, отличной отS
. Я понятия не имею, почему вы будете заботиться о не-ASCII, если вы отфильтровываете имена, начинающиеся сS
... Определенно, из-за вас это так запутанно.Get-ItemProperty -name Version,Release -EA 0
, делает. Я знаю, так-EA 0
же, как-ErrorAction SilentlyContinue
, но какой эффект будетGet-ItemProperty -name Version,Release
иметь при передаче всех результатов к нему? Кажется, он не удаляет какие-либо переменные из объекта, так как другие используются в более поздних командах в конвейере. Он запускается, выдает ошибку, если в ключе отсутствует имяVersion
илиRelease
, и затем передает объекты, для которых он был выполнен успешно, в следующую команду в конвейере?(?!S)
предложение,(?![SW])
чтобы исключить записи «Windows *». Это также можно сделать,(?=[vCF])
поскольку единственные ключи, которые нас действительно волнуют, - это корни версии и ключи «Полный» и «Клиент» для .NET 4.0+. ;)Этот ответ не возвращает 4.5, если он установлен. Ответ ниже от @Jaykul и с помощью recurse делает.
источник
В скрипт добавлена поддержка v4.8:
источник
Дает вам экземпляр
Version
для CLR, который используется текущей копией PSH (как описано здесь ).источник
$PSVersionTable
версию CLR, на которой работает PowerShell.Правильный синтаксис:
GetSystemVersion
Функция возвращает строку , как это:или как это
$PSVersionTable
это объект только для чтения. Свойство CLRVersion - это структурированный номер версии, подобный следующему:источник
Я нашел это через завершение вкладки в powershell для osx:
[System.Runtime.InteropServices.RuntimeInformation]::get_FrameworkDescription() .NET Core 4.6.25009.03
источник
[version]([Runtime.InteropServices.RuntimeInformation]::FrameworkDescription -replace '^.[^\d.]*','')
Не существует надежного способа сделать это для всех платформ и архитектур с использованием простого сценария. Если вы хотите узнать, как сделать это надежно, начните с публикации в блоге Обновленный образец кода обнаружения .NET Framework, который выполняет более глубокую проверку .
источник
Обратитесь к странице Script, чтобы узнать, какие версии .NET установлены на удаленных рабочих станциях .
Сценарий может быть полезен для поиска версии .NET для нескольких компьютеров в сети.
источник
Хорошее решение
Попробуйте использовать загружаемый модуль DotNetVersionLister (на основе информации реестра и таблицы поиска версий от маркетинговой версии).
Который будет использоваться так:
Или вот так, если вы просто хотите проверить его на какой-то .NET Framework> = 4. * :
Но это не будет работать (установка / импорт), например, с PS v2.0 ( Win 7 , Win Server 2010 стандарт) из-за несовместимости ...
Мотивация для «наследственных» функций ниже
(Вы можете пропустить чтение и использовать код ниже)
Нам пришлось работать с PS 2.0 на некоторых машинах и не удалось установить / импортировать вышеупомянутый DotNetVersionLister .
На других машинах мы хотели обновить (с PS 2.0 ) до PS 5.1 (который, в свою очередь, нуждается в .NET Framework> = 4.5 ) с помощью двух пользовательских
Install-DotnetLatestCompany
иInstall-PSLatestCompany
.Чтобы хорошо провести администраторов через процесс установки / обновления, нам нужно определить версию .NET в этих функциях на всех машинах и существующих версиях PS.
Таким образом, мы использовали также следующие функции, чтобы определить их более безопасно во всех средах ...
Функции для устаревших сред PS (например, PS v2.0 )
Поэтому следующий код и приведенные ниже (извлеченные) примеры использования полезны здесь (на основе других ответов здесь):
Пример использования:
источник
(Get-DotNetVersion -LocalHost -nosummary).">=4.x"
Не красиво Определенно не очень
Это может или не может работать. Но что касается последней версии, то это должно быть довольно надежно, поскольку для старых версий (1.0, 1.1) есть практически пустые папки, но не более новые - они появляются только после установки соответствующей инфраструктуры.
Тем не менее, я подозреваю, что должен быть лучший способ.
источник
ls $Env:windir\Microsoft.NET\Framework | ? { $_.PSIsContainer -and $_.Name -match '^v\d.[\d\.]+' } | % { $_.Name.TrimStart('v') }
Если вы установили Visual Studio на свой компьютер, откройте командную строку разработчика Visual Studio и введите следующую команду: clrver
В нем будут перечислены все установленные версии .NET Framework на этом компьютере.
источник
Вот мой взгляд на этот вопрос после документации MSFT :
Этот пример работает со всеми версиями PowerShell и будет работать постоянно, поскольку 4.8 является последней версией .NET Framework.
источник
Вот общая идея:
Получите дочерние элементы в каталоге .NET Framework, которые являются контейнерами, имена которых соответствуют шаблону v число точка число . Отсортируйте их по убыванию имени, возьмите первый объект и верните его свойство name.
Вот сценарий:
источник
Я хотел бы попробовать это в PowerShell: работал для меня!
(Get-ItemProperty "HKLM: Программное обеспечение \ Microsoft \ NET Framework Setup \ NDP \ v4 \ Full"). Версия
источник
Я не разбираюсь в моем синтаксисе PowerShell, но думаю, что вы могли бы просто вызвать System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion () . Это вернет версию в виде строки (что-то вроде
v2.0.50727
, я думаю).источник
[System.Runtime.InteropServices.RuntimeEnvironment]::GetSystemVersion()
но он просто возвращает v4.0.30319, даже если v4.6 установлен в моем случае.Это производный от предыдущего поста, но в моих тестах он получил последнюю версию .net framework 4.
Который позволит вам вызвать команду на удаленную машину:
Который устанавливает эту возможность с ADModule и префиксом соглашения об именах:
источник