我的PowerShell脚本使用哪个.NET版本?

lan*_*nce 41 .net powershell version

我想在我即将编写的一些PowerShell脚本中使用.NET - 当这些脚本运行时,我如何知道/声明我正在处理哪个版本的.NET?

是否可以选择运行哪个版本的.NET脚本?

Kei*_*ill 39

在PowerShell 2.0上,只需看一下$PSVersionTable变量:

PS> $psversiontable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.4927
BuildVersion                   6.1.7600.16385
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1
Run Code Online (Sandbox Code Playgroud)

在PowerShell 1.0上,使用[System.Environment]::Version:

PS> [Environment]::Version

Major  Minor  Build  Revision
-----  -----  -----  --------
2      0      50727  4927
Run Code Online (Sandbox Code Playgroud)

  • @Backwards_Dave是,CLRVersion表示公共语言运行库的版本.您可以将该版本号与正在使用的.NET Framework版本相关联 - 这可以回答http://stackoverflow.com/questions/212896/how-do-the-net-framework-clr-and-visual-studio-version-数字-涉及到每个 (8认同)
  • 在 Powershell core/ PS 7 中,此答案中的*旧*方式(`[Environment]::Version`)是获取 CLR 版本(此处提到的两者)的唯一有效方法。 (7认同)
  • 哪一个是.NET版本?这是CLRVersion吗? (3认同)

Geo*_*rth 16

要获得.NET版本:

[System.Reflection.Assembly]::GetExecutingAssembly().ImageRuntimeVersion
Run Code Online (Sandbox Code Playgroud)

...默认情况下,System.Management.Automation.dll编译下的assembly()的CLR版本.

不,你不能选择你可以运行脚本的.NET版本.

  • 在powershell中版本最干净的方法可能是:[environment] :: Version (6认同)
  • George_Howarth,这不是真的.正如jmh_gr指出的那样,你可以覆盖使用的.NET版本(因此它不是硬编码的).我需要在PS1中检查.NET4程序集的版本,为此,我应用了下面发布的技巧jmh_gr(.NET 1读取较新的程序集类型失败).运行"[System.Reflection.Assembly] :: GetExecutingAssembly().ImageRuntimeVersion"返回v2.0.50727,但运行"[Environment] :: Version"会返回更准确的4.0.30319.296. (2认同)

Jos*_*nig 16

...不,您无法选择可以运行脚本的.NET版本 - George Howarth

哇,那不是真的!您可以指定PowerShell使用的.NET版本.关键是.NET标准应用程序配置文件,其格式为[appname] .exe.config.您可以将其放在与大多数.NET应用程序相同的目录中 - 包括PowerShell和PowerShell ISE可执行文件 - 并且CLR将自动加载配置文件中指定的任何可识别选项.其中一个选项是您希望应用程序使用的CLR版本.

这在问题中有详细记录:如何使用.NET 4运行时运行PowerShell?.特别是,看看Emperor XLII的帖子.


dri*_*iis 7

可以从mscorlib的版本推断出.NET版本.因此,您可以在PowerShell中执行以下操作以输出当前版本的.NET:

$a = [System.Reflection.Assembly]::Load("mscorlib")
$a.GetName().Version
Run Code Online (Sandbox Code Playgroud)

  • 您不必加载mscorlib,因为默认情况下它已经加载到应用程序域:`([AppDomain] :: CurrentDomain.GetAssemblies()|?{$ _.GetName().Name -eq"mscorlib"}).的GetName().Version` (4认同)
  • 更容易使用:[环境] ::版本 (3认同)
  • @ x0n [enviroment] :: version返回CLR版本,但mscorlib.GetName().版本返回正在使用的.net框架 (2认同)

Jep*_*sen 5

这是一个旧线程,我现在要发布的答案不适用于 2017 年左右之前的 .NET 版本。

有一个新的FrameworkDescription财产

尝试:

[System.Runtime.InteropServices.RuntimeInformation]::FrameworkDescription
Run Code Online (Sandbox Code Playgroud)

但请注意,在某些版本的Windows PowerShell 上(不确定较新的 PowerShell 6 和 7 等),不同的System.Runtime.InteropServices.RuntimeInformation程序集中有两种不同的类型!而且只有其中一人拥有该财产。因此,您必须符合以下条件:

[System.Runtime.InteropServices.RuntimeInformation, Microsoft.Powershell.PSReadline]::FrameworkDescription   # does not exist
[System.Runtime.InteropServices.RuntimeInformation, mscorlib]::FrameworkDescription   # good
Run Code Online (Sandbox Code Playgroud)