什么是 Add-Type 与方括号?

tex*_*uce 4 syntax powershell constructor

要使用 .net 类型,我通常会Add-Type使用New-Object

Add-Type -AssemblyName "System.Windows.Forms"
$win = New-Object Windows.Forms.Form
Run Code Online (Sandbox Code Playgroud)

但实际上我也可以使用方括号语法来引用类型并使用静态方法:

$win = [System.Windows.Forms.Form]::new()
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别?我没有找到太多有关 .Net 类型的方括号语法的文档。我找到的所有关于方括号的文档都是针对数组的。

mkl*_*nt0 5

Add-Type仅用于将.NET 类型加载到会话中(或通过临时编译来定义它们)。

要通过调用它们的构造函数来使用这些类型,您有两种选择:

  • 任何PowerShell 版本中:

  • 最好在 PowerShell v5+中:

    • 使用类型文字( [...]) 并调用该类型的(PowerShell 提供的)静态::new()方法。
    • 有关 PowerShell 类型文字的更多信息,请参阅此答案。

正如Lee_DaileyTheo所指出的,使用静态::new()方法有几个优点:

  • 通话::new()速度更快;使用单个或仅几个构造函数调用可能并不重要,但它可能会循环。

  • ::new 不带括号执行会显示所有构造函数重载,这是找出需要哪些构造函数参数及其类型的便捷方法。

  • 调用::new()不会将新创建的实例包装在一个(大部分情况下)不可见的[psobject]包装器中,New-Object而 cmdlet 通常会这样做;虽然此包装器大部分是良性的,但它可能会导致行为上的细微差异 - 请参阅GitHub 问题 #5579

请注意,由于 PowerShell 的两种基本解析模式New-Object并且::new()需要不同的语法,如本答案中所讨论的。