共用方式為


Add-Type

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

語法

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

Description

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

您可以指定現有的元件或原始碼檔案來指定類型,也可以指定內嵌或儲存在變數中的原始碼。 您甚至可以只指定方法和 Add-Type 定義併產生 類別。 在 Windows 上,您可以使用這項功能,在 PowerShell 中對 Unmanaged 函式進行平台調用 (P/Invoke) 呼叫。 如果您指定原始程式碼,Add-Type 會編譯指定的原始程式碼,併產生包含新 .NET Framework 類型的記憶體內部元件。

您可以使用 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的非靜態方法。

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

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

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

$BasicTestObject 使用 Multiply 方法。 整數會相乘,並顯示產品。

範例 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()

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

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

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

範例 3:從元件新增類型

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

$AccType = Add-Type -AssemblyName "accessib*" -PassThru

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

範例 4:呼叫原生 Windows API

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

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

$addTypeSplat = @{
    MemberDefinition = $Signature
    Name = "Win32ShowWindowAsync"
    Namespace = 'Win32Functions'
    PassThru = $true
}
$ShowWindowAsync = Add-Type @addTypeSplat

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

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

若要將PowerShell控制台降到最低,ShowWindowAsync 使用 Get-Process Cmdlet 搭配 $PID 自動變數,以取得裝載目前PowerShell工作階段的程式。 然後使用目前進程的 MainWindowHandle 屬性,以及代表 SW_MINIMIZE 值的 2值。

若要還原視窗,ShowWindowAsync 會針對代表 SW_RESTORE 值的視窗位置使用 4 值。

若要最大化視窗,請使用代表 SW_MAXIMIZE3 值。

範例 5:從 Visual Basic 檔案新增類型

這個範例會使用 Add-Type Cmdlet,將 VBFromFile 類別新增至目前會話中定義的 Hello.vb 檔案。 命令輸出中會顯示 Hello.vb 檔案的文字。

Add-Type -Path "C:\PS-Test\Hello.vb"
[VBFromFile]::SayHello(", World")

# From Hello.vb

Public Class VBFromFile
  Public Shared Function SayHello(sourceName As String) As String
    Dim myValue As String = "Hello"
    return myValue + sourceName
  End Function
End Class

Hello, World

Add-Type 會使用 Path 參數來指定原始程式檔 Hello.vb,並新增檔案中定義的類型。 SayHello 函式會呼叫為 VBFromFile 類別的靜態方法。

範例 6:新增具有 JScript.NET 的類別

此範例會使用 JScript.NET,在 PowerShell 工作階段中建立新的類別,FRectangle

Add-Type @'
 class FRectangle {
   var Length : double;
   var Height : double;
   function Perimeter() : double {
       return (Length + Height) * 2; }
   function Area() : double {
       return Length * Height;  } }
'@ -Language JScript

$rect = [FRectangle]::new()
$rect

Length Height
------ ------
     0      0

範例 7:新增 F# 編譯程式

此範例示範如何使用 Add-Type Cmdlet,將 F# 程式代碼編譯程式新增至 PowerShell 會話。 若要在PowerShell中執行此範例,您必須具有與 F# 語言一起安裝的 FSharp.Compiler.CodeDom.dll

Add-Type -Path "FSharp.Compiler.CodeDom.dll"
$Provider = New-Object Microsoft.FSharp.Compiler.CodeDom.FSharpCodeProvider
$FSharpCode = @"
let rec loop n =if n <= 0 then () else beginprint_endline (string_of_int n);loop (n-1)end
"@
$FSharpType = Add-Type -TypeDefinition $FSharpCode -CodeDomProvider $Provider -PassThru |
   Where-Object { $_.IsPublic }
$FSharpType::loop(4)

4
3
2
1

Add-Type 會使用 Path 參數來指定元件,並取得元件中的類型。 New-Object 會建立 F# 程式代碼提供者的實例,並將結果儲存在 $Provider 變數中。 $FSharpCode 變數會儲存定義 循環 方法的 F# 程式代碼。

$FSharpType 變數會儲存 Add-Type Cmdlet 的結果,以儲存在 $FSharpCode中定義的公用類型。 TypeDefinition 參數會指定定義型別的原始程式碼。 CodeDomProvider 參數會指定原始程式碼編譯程式。 PassThru 參數會指示 Add-Type 傳回代表型別的 Runtime 物件。 物件會從管線向下傳送至 Where-Object Cmdlet,而 Cmdlet 只會傳回公用類型。 會使用 Where-Object Cmdlet,因為 F# 提供者會產生非公用類型來支持產生的公用類型。

迴圈方法會呼叫為儲存在 $FSharpType 變數中之類型的靜態方法。

參數

-AssemblyName

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

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

使用 PathLiteralPath 參數可確保您要載入的元件。 當您使用 AssemblyName 參數時,PowerShell 會要求 .NET 使用標準 .NET 元件解析程式解析元件名稱。 由於 .NET 會先搜尋應用程式資料夾,Add-Type 可能會從 $PSHOME 載入元件,而不是目前資料夾中的版本。 如需詳細資訊,請參閱 元件位置

如果 .NET 無法解析名稱,PowerShell 就會在目前的位置尋找元件。 當您在 AssemblyName 參數中使用通配符時,.NET 元件解析程式會失敗,導致 PowerShell 查看目前的位置。

類型:String[]
別名:AN
Position:Named
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:True

-CodeDomProvider

指定程式代碼產生器或編譯程式。 Add-Type 會使用指定的編譯程式來編譯原始程式碼。 預設值為 C# 編譯程式。 如果您使用無法使用 Language 參數來指定的語言,請使用此參數。 您指定的 CodeDomProvider 必須能夠從原始程式碼產生元件。

類型:CodeDomProvider
別名:Provider
Position:Named
預設值:C# compiler
必要:False
接受管線輸入:False
接受萬用字元:False

-CompilerParameters

指定原始碼編譯程式的選項。 這些選項會傳送至編譯程式,而不會進行修訂。

此參數可讓您指示編譯程式產生可執行檔、內嵌資源或設定命令行選項,例如 /unsafe 選項。 此參數會實作 CompilerParameters 類別,System.CodeDom.Compiler.CompilerParameters

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

類型:CompilerParameters
別名:CP
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-IgnoreWarnings

忽略編譯程式警告。 使用此參數可防止 Add-Type 將編譯程式警告視為錯誤。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Language

指定原始碼中使用的語言。 Add-Type Cmdlet 會使用此參數的值來選取適當的 CodeDomProvider。 CSharp 是預設值。 此參數可接受的值如下:

  • CSharp
  • CSharpVersion2
  • CSharpVersion3
  • JScript
  • VisualBasic
類型:Language
接受的值:CSharp, CSharpVersion2, CSharpVersion3, JScript, VisualBasic
Position:Named
預設值:CSharp
必要:False
接受管線輸入:False
接受萬用字元:False

-LiteralPath

指定包含型別的原始碼檔案或元件 DLL 檔案的路徑。 與 Path不同,LiteralPath 參數的值會與類型完全相同。 不會將任何字元解譯為通配符。 如果路徑包含逸出字元,請以單引弧括住它。 單引號會告知PowerShell不要將任何字元解譯為逸出序列。

使用 PathLiteralPath 參數可確保您要載入的元件。

類型:String[]
別名:PSPath
Position:Named
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-MemberDefinition

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

在 Windows 上,您可以使用這項功能,在 PowerShell 中對 Unmanaged 函式進行平台調用 (P/Invoke) 呼叫。

類型:String[]
Position:1
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-Name

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

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

類型:String
Position:0
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-Namespace

根據預設,此命令會在 Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 命名空間中建立類型。 當您使用此參數時,會在指定的命名空間中建立類型。 如果值為空字串,則會在全域命名空間中建立類型。

類型:String
別名:NS
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-OutputAssembly

為位置中具有指定名稱的元件產生 DLL 檔案。 輸入選擇性路徑和檔名。 允許通配符。 根據預設,Add-Type 只會在記憶體中產生元件。 如果您將元件輸出至檔案,您應該包含 PassThru 參數,以從新建立的元件傳回類型。

類型:String
別名:OA
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:True

-OutputType

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

此參數可接受的值如下:

  • ConsoleApplication
  • Library
  • WindowsApplication
類型:OutputAssemblyType
別名:OT
接受的值:ConsoleApplication, Library, WindowsApplication
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-PassThru

會傳回 System.Runtime 物件,代表已新增的類型。 根據預設,此 Cmdlet 不會產生任何輸出。 如果您使用 OutputAssembly 來建立 DLL 檔案,而且您想要從新建立的元件傳回類型,請使用此參數。

類型:SwitchParameter
Position:Named
預設值:False
必要:False
接受管線輸入:False
接受萬用字元:False

-Path

指定包含型別的原始碼檔案或元件 DLL 檔案的路徑。

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

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

類型:String[]
Position:0
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-ReferencedAssemblies

指定型別相依的元件。 根據預設,Add-Type 參考 System.dllSystem.Management.Automation.dll。 除了預設元件之外,您還可以參考您使用此參數指定的元件。

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

類型:String[]
別名:RA
Position:Named
預設值:None
必要:False
接受管線輸入:False
接受萬用字元:False

-TypeDefinition

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

在您的類型定義中包含命名空間宣告。 如果您省略命名空間宣告,您的類型可能會與另一個類型或另一個型別的快捷方式同名,而導致無意覆寫。 例如,如果您定義名為 Exception的類型,則使用 Exception 腳本做為 System.Exception 的快捷方式將會失敗。

類型:String
Position:0
預設值:None
必要:True
接受管線輸入:False
接受萬用字元:False

-UsingNamespace

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

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

類型:String[]
別名:Using
Position:Named
預設值:System namespace
必要:False
接受管線輸入:False
接受萬用字元:False

輸入

None

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

輸出

None

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

Type

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

備註

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

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

某些語言的 CodeDomProvider 類別不會產生輸出,例如 IronPython 和 J#。 因此,以這些語言撰寫的類型無法與 Add-Type搭配使用。

此 Cmdlet 是以 Microsoft .NET Framework CodeDomProvider 類別為基礎。