共用方式為


Add-Type

將 Microsoft .NET Core 類別新增至 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# 是預設值、編譯程式選項、元件相依性、類別命名空間、型別的名稱,以及產生的元件。

範例

範例 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使用 Cmdlet 搭配 BasicTest 類別來建立New-Object。 輸出會顯示變數的值是 BasicTest 類別的$BasicTestObject實例,而且它包含名為Multiply的成員。

範例 3:從元件新增類型

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

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

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

變數 $AccType 會儲存使用 Cmdlet 建立的物件 Add-TypeAdd-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_MAXIMIZE3 值。

參數

-AssemblyName

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

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

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

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

-CompilerOptions

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

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

您無法在相同的命令中使用 CompilerOptionsReferencedAssemblies 參數。

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

-IgnoreWarnings

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

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

-Language

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

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

-LiteralPath

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

Type:String[]
Aliases:PSPath, LP
Position:Named
Default value:None
Required:True
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
Required:True
Accept pipeline input:False
Accept wildcard characters:False

-Name

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

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

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

-Namespace

指定類型的命名空間。

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

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

-OutputAssembly

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

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

-OutputType

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

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

  • ConsoleApplication
  • 媒體櫃
  • WindowsApplication

重要

ConsoleApplicationWindowsApplication 值不會產生正常運作的輸出,不應使用。

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

-PassThru

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

Type:SwitchParameter
Position:Named
Default value:False
Required: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
Required:True
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
Required:False
Accept pipeline input:False
Accept wildcard characters:False

-TypeDefinition

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

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

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

-UsingNamespace

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

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

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

輸入

None

您無法將物件向下傳送至 Add-Type管線。

輸出

None or System.Type

當您使用 PassThru 參數時, Add-Type 會傳回代表新類型的 System.Type 物件。 否則,此 Cmdlet 不會產生任何輸出。

備註

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

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

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

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