Add-Type

將Microsoft .NET 類別新增至 PowerShell 會話。

Syntax

Add-Type
   [-TypeDefinition] <String>
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   [-Name] <String>
   [-MemberDefinition] <String[]>
   [-Namespace <String>]
   [-UsingNamespace <String[]>]
   [-Language <Language>]
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   [-Path] <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   -LiteralPath <String[]>
   [-ReferencedAssemblies <String[]>]
   [-OutputAssembly <String>]
   [-OutputType <OutputAssemblyType>]
   [-PassThru]
   [-IgnoreWarnings]
   [-CompilerOptions <String[]>]
   [<CommonParameters>]
Add-Type
   -AssemblyName <String[]>
   [-PassThru]
   [<CommonParameters>]

Description

Cmdlet Add-Type 可讓您在 PowerShell 會話中定義Microsoft .NET Core 類別。 接著,您可以使用 Cmdlet 來具現化物件 New-Object ,並使用 物件,就像使用任何 .NET Core 物件一樣。 如果您將命令新增 Add-Type 至 PowerShell 設定檔,則類別適用于所有 PowerShell 會話。

您可以透過指定現有組件或原始程式碼檔案來指定類型,或者指定變數中內嵌或預存的原始程式碼。 您甚至可以只指定方法,並 Add-Type 定義並產生 類別。 在 Windows 上,您可以使用這項功能,讓 Platform Invoke (P/Invoke) PowerShell 中的 Unmanaged 函式呼叫。 如果您指定原始程式碼, Add-Type 請編譯指定的原始程式碼,並產生包含新 .NET Core 類型的記憶體內部元件。

您可以使用 的參數 Add-Type 來指定替代語言和編譯器,C# 是預設值、編譯器選項、元件相依性、類別命名空間、類型名稱,以及產生的元件。

從 PowerShell 7 開始,如果具有相同名稱的類型已經存在, Add-Type 則不會編譯類型。 此外, Add-Type 在包含 的資料夾下,尋找 資料夾中的 pwsh.dll 元件 ref

範例

範例 1:將 .NET 類型新增至會話

這個範例會藉由指定儲存在變數中的原始程式碼,將 BasicTest 類別新增至會話。 BasicTest類別可用來加入整數、建立物件,以及相乘整數。

$Source = @"
public class BasicTest
{
  public static int Add(int a, int b)
    {
        return (a + b);
    }
  public int Multiply(int a, int b)
    {
    return (a * b);
    }
}
"@

Add-Type -TypeDefinition $Source
[BasicTest]::Add(4, 3)
$BasicTestObject = New-Object BasicTest
$BasicTestObject.Multiply(5, 2)

變數 $Source 會儲存 類別的原始程式碼。 此類型具有稱為 Add 的靜態方法,以及稱為 Multiply 的非靜態方法。

Cmdlet Add-Type 會將 類別新增至會話。 因為其使用內嵌原始程式碼,所以命令會使用 TypeDefinition 參數來指定變數中的 $Source 程式碼。

AddBasicTest類別的靜態方法會使用雙冒號字元 () :: 來指定類別的靜態成員。 會加入整數,並顯示總和。

Cmdlet New-Object 會具現化 BasicTest 類別的實例。 它會將新物件儲存在 變數中 $BasicTestObject

$BasicTestObjectMultiply會使用 方法。 整數會相乘,並顯示乘積。

範例 2:檢查新增的類型

此範例會 Get-Member 使用 Cmdlet 來檢查範例 1中建立的 Add-TypeNew-Object Cmdlet 物件。

[BasicTest] | Get-Member

TypeName: System.RuntimeType

Name                 MemberType Definition
----                 ---------- ----------
AsType               Method     type AsType()
Clone                Method     System.Object Clone(), System.Object ICloneable.Clone()
Equals               Method     bool Equals(System.Object obj), bool Equals(type o)
FindInterfaces       Method     type[] FindInterfaces(System.Reflection.TypeFilter filter...
...

[BasicTest] | Get-Member -Static

TypeName: BasicTest

Name            MemberType Definition
----            ---------- ----------
Add             Method     static int Add(int a, int b)
Equals          Method     static bool Equals(System.Object objA, System.Object objB)
new             Method     BasicTest new()
ReferenceEquals Method     static bool ReferenceEquals(System.Object objA, System.Object objB)

$BasicTestObject | Get-Member

TypeName: BasicTest

Name        MemberType Definition
----        ---------- ----------
Equals      Method     bool Equals(System.Object obj)
GetHashCode Method     int GetHashCode()
GetType     Method     type GetType()
Multiply    Method     int Multiply(int a, int b)
ToString    Method     string ToString()

Cmdlet Get-Member 會取得新增至會話之 BasicTest 類別 Add-Type 的類型和成員。 此命令 Get-Member 會顯示它是 System.RuntimeType 物件,其衍生自 System.Object 類別。

Get-MemberStatic參數會取得BasicTest類別的靜態屬性和方法。 輸出會顯示 Add 方法已包含。

Cmdlet Get-Member 會取得儲存在 變數中的 $BasicTestObject 物件成員。 $BasicTestObject 是使用 New-Object Cmdlet 搭配 BasicTest 類別所建立。 輸出會顯示變數的值是BasicTest類別的 $BasicTestObject 實例,而且它包含名為 Multiply 的成員。

範例 3:從元件新增類型

本範例會將元件中的 NJsonSchema.dll 類別新增至目前的會話。

Set-Location -Path $PSHOME
$AccType = Add-Type -AssemblyName *jsonschema* -PassThru

Set-Location 會使用 Path 參數來指定 $PSHOME 變數。 變數會參考 DLL 檔案所在的 PowerShell 安裝目錄。

變數 $AccType 會儲存使用 Add-Type Cmdlet 建立的物件。 Add-Type 會使用 AssemblyName 參數來指定元件的名稱。 星號 (*) 萬用字元可讓您取得正確的元件,即使您不確定名稱或其拼字。 PassThru參數會產生代表新增至會話之類別的物件。

範例 4:呼叫原生 Windows API

此範例示範如何在 PowerShell 中呼叫原生 Windows API。 Add-Type 會使用 Platform Invoke (P/Invoke) 機制,從 PowerShell 呼叫 中的 User32.dll 函式。 此範例僅適用于執行 Windows 作業系統的電腦上。

$Signature = @"
[DllImport("user32.dll")]public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
"@

$ShowWindowAsync = Add-Type -MemberDefinition $Signature -Name "Win32ShowWindowAsync" -Namespace Win32Functions -PassThru

# Minimize the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $pid).MainWindowHandle, 2)

# Restore the PowerShell console

$ShowWindowAsync::ShowWindowAsync((Get-Process -Id $Pid).MainWindowHandle, 4)

變數 $Signature 會儲存函式的 ShowWindowAsync C# 簽章。 為了確保產生的方法顯示在 PowerShell 會話中, public 關鍵字已新增至標準簽章。 如需詳細資訊,請參閱 ShowWindowAsync 函式

變數 $ShowWindowAsync 會儲存PassThru參數所 Add-Type 建立的物件。 Cmdlet 會將 Add-TypeShowWindowAsync 式新增至 PowerShell 會話作為靜態方法。 此命令會使用 MemberDefinition 參數來指定儲存在變數中的 $Signature 方法定義。 此命令會使用 NameNamespace 參數指定類別的名稱和命名空間。 PassThru參數會產生代表型別的物件。

新的 ShowWindowAsync 靜態方法用於命令中,以最小化和還原 PowerShell 主控台。 方法會採用兩個參數:視窗控制碼,以及指定視窗顯示方式的整數。

若要將 PowerShell 主控台最小化, ShowWindowAsync 請使用 Get-Process Cmdlet 搭配 $PID 自動變數來取得裝載目前 PowerShell 會話的程式。 然後它會使用目前進程的MainWindowHandle屬性,以及 代表 SW_MINIMIZE 值的 值 2

若要還原視窗, ShowWindowAsync 請使用 的值 4 作為視窗位置的值,代表 SW_RESTORE 值。

若要最大化視窗,請使用 代表 SW_MAXIMIZE 的值 3

參數

-AssemblyName

指定包含類型之組件的名稱。 Add-Type 會從指定的元件取得型別。 當您根據元件名稱建立類型時,需要此參數。

輸入元件的完整或簡單名稱,也稱為部分名稱。 組件名稱允許使用萬用字元。 如果您輸入簡單或部分名稱, Add-Type 請將它解析為完整名稱,然後使用完整名稱載入元件。

此參數不接受路徑或檔案名。 若要輸入元件動態連結程式庫 (DLL) 檔案的路徑,請使用 Path 參數。

Type:String[]
Aliases:AN
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:True

-CompilerOptions

指定原始程式碼編譯器的選項。 這些選項會在不經過修訂的情況下傳送至編譯器。

此參數可讓您指示編譯器產生可執行檔、內嵌資源或設定命令列選項,例如 /unsafe 選項。

您無法在同一個命令中使用 CompilerOptionsReferencedAssemblies 參數。

Type:String[]
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-IgnoreWarnings

忽略編譯器警告。 使用此參數可防止 Add-Type 將編譯器警告當做錯誤來處理。

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Language

指定在原始程式碼中使用的語言。 此參數可接受的值為

  • CSharp
Type:Language
Accepted values:CSharp
Position:Named
Default value:CSharp
Accept pipeline input:False
Accept wildcard characters:False

-LiteralPath

指定包含類型之原始程式碼檔案或組件 DLL 檔案的路徑。 不同于 PathLiteralPath 參數的值會與輸入時完全相同。 沒有字元會被視為萬用字元。 如果路徑包含逸出字元,請將它括在單引號中。 單引號會指示 PowerShell 不要將任何字元解譯為逸出序列。

Type:String[]
Aliases:PSPath, LP
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-MemberDefinition

為類別指定新的屬性或方法。 Add-Type 會產生支援屬性或方法所需的範本程式碼。

在 Windows 上,您可以使用這項功能,讓 Platform Invoke (P/Invoke) PowerShell 中的 Unmanaged 函式呼叫。

Type:String[]
Position:1
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Name

指定要建立之類別的名稱。 從成員定義產生類型時,此參數是必要的。

類別名稱和命名空間在工作階段中必須是唯一的。 您無法卸載類型或加以變更。 若要變更類型的程式碼,您必須變更名稱或啟動新的 PowerShell 會話。 否則命令會失敗。

Type:String
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-Namespace

指定類型的命名空間。

如果此命令中未包含此參數,則會在Microsoft中建立類型。PowerShell.Commands.AddType.AutoGeneratedTypes命名空間。 如果 參數包含在命令中,且具有空字串值或 的值 $Null ,則會在全域命名空間中產生類型。

Type:String
Aliases:NS
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-OutputAssembly

使用位置中的指定名稱來產生組件的 DLL 檔。 輸入選擇性路徑和檔案名。 允許使用萬用字元。 根據預設, Add-Type 只會在記憶體中產生元件。

Type:String
Aliases:OA
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:True

-OutputType

指定輸出組件的輸出類型。 預設不會指定任何輸出類型。 此參數只有在命令中已指定輸出組件時才有效。 如需值的詳細資訊,請參閱 OutputAssemblyType 列舉

此參數可接受的值如下所示:

  • ConsoleApplication
  • Library
  • WindowsApplication

重要

自 PowerShell 7.1 起, ConsoleApplication 且不支援 , WindowsApplication 而且如果其中一個指定為 OutputType 參數的值,則 PowerShell 會擲回終止錯誤。

Type:OutputAssemblyType
Aliases:OT
Accepted values:ConsoleApplication, Library, WindowsApplication
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-PassThru

傳回代表已新增之類型的 System.Runtime 物件。 根據預設,此 Cmdlet 不會產生任何輸出。

Type:SwitchParameter
Position:Named
Default value:False
Accept pipeline input:False
Accept wildcard characters:False

-Path

指定包含類型之原始程式碼檔案或組件 DLL 檔案的路徑。

如果您提交原始程式碼檔案, Add-Type 請在檔案中編譯器代碼,並建立類型的記憶體內部元件。 Path值中指定的副檔名會決定所使用的編譯器 Add-Type

如果您提交元件檔案, Add-Type 請從元件取得類型。 若要指定記憶體內組件或全域組件快取,請使用 AssemblyName 參數。

Type:String[]
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-ReferencedAssemblies

指定類型相依的組件。 根據預設, Add-Type 參考 System.dllSystem.Management.Automation.dll 。 除了參照預設組件之外,也會參照您使用此參數指定的組件。

從 PowerShell 6 開始, ReferencedAssemblies 不包含預設的 .NET 元件。 您必須在傳遞給此參數的值中包含它們的特定參考。

您無法在同一個命令中使用 CompilerOptionsReferencedAssemblies 參數。

Type:String[]
Aliases:RA
Position:Named
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-TypeDefinition

指定包含類型定義的原始程式碼。 以字串或 here-string 輸入原始程式碼,或者輸入包含原始程式碼的變數。 如需 here-strings 的詳細資訊,請參閱 about_Quoting_Rules

在您的類型定義中包含命名空間宣告。 如果您省略命名空間宣告,您的類型的名稱可能會與其他類型或其他類型的捷徑名稱相同,這會造成意外覆寫。 例如,如果您定義稱為 Exception的類型,使用 Exception 作為 System.Exception 快捷方式的腳本將會失敗。

Type:String
Position:0
Default value:None
Accept pipeline input:False
Accept wildcard characters:False

-UsingNamespace

指定類別需要的其他命名空間。 這與 C# 關鍵字 Using 非常類似 。

根據預設, Add-Type 會參考 系統 命名空間。 使用 MemberDefinition 參數時, Add-Type 也預設會參考 System.Runtime.InteropServices 命名空間。 除了參照預設命名空間之外,也會參照您使用 UsingNamespace 參數新增的命名空間。

Type:String[]
Aliases:Using
Position:Named
Default value:System namespace
Accept pipeline input:False
Accept wildcard characters:False

輸入

None

您無法使用管線將物件傳送至此 Cmdlet。

輸出

None

根據預設,此 Cmdlet 不會傳回任何輸出。

Type

當您使用 PassThru 參數時,此 Cmdlet 會傳回代表新類型的 System.Type 物件。

備註

您新增的類型只存在於目前的工作階段。 若要在所有會話中使用類型,請將這些類型新增至您的 PowerShell 設定檔。 如需設定檔的詳細資訊,請參閱 about_Profiles

類型名稱和命名空間在會話內必須是唯一的。 您無法卸載類型或加以變更。 如果您需要變更類型的程式碼,您必須變更名稱或啟動新的 PowerShell 會話。 否則命令會失敗。

在 Windows PowerShell (5.1 版和更新版本中,) ,您必須針對尚未載入的任何專案使用 Add-Type 。 最常見的情況是,這適用于全域組件快取 (GAC) 中找到的元件。 在 PowerShell 6 和更新版本中,沒有 GAC,因此 PowerShell 會在 中 $PSHome 安裝自己的元件。 這些元件會在要求時自動載入,因此不需要使用 Add-Type 來載入這些元件。 不過,仍允許使用 Add-Type 允許腳本與任何版本的 PowerShell 隱含相容。

GAC 中的元件可以依類型名稱載入,而不是依路徑載入。 從任意路徑載入元件需要 Add-Type ,因為這些元件無法自動載入。