次の方法で共有


Add-Type

PowerShell セッションに Microsoft .NET クラスを追加します。

構文

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>]

説明

Add-Type コマンドレットを使用すると、PowerShell セッションで Microsoft .NET Framework クラスを定義できます。 その後、 New-Object コマンドレットを使用してオブジェクトをインスタンス化し、.NET Framework オブジェクトを使用するのと同じようにオブジェクトを使用できます。 Add-Type コマンドを PowerShell プロファイルに追加すると、そのクラスはすべての PowerShell セッションで使用できます。

既存のアセンブリまたはソース コード ファイルを指定して型を指定することも、インラインで、または変数に保存されたソース コードを指定することもできます。 メソッドのみを指定することもでき、クラスを定義して生成 Add-Type 。 Windows では、この機能を使用して、PowerShell でアンマネージ関数にプラットフォーム呼び出し (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 コマンドレットは、クラスをセッションに追加します。 インライン ソース コードを使用しているため、コマンドは TypeDefinition パラメーターを使用して、 $Source 変数にコードを指定します。

BasicTest クラスのAdd静的メソッドは、二重コロン文字 (::) を使用してクラスの静的メンバーを指定します。 整数が追加され、合計が表示されます。

New-Object コマンドレットは、BasicTest クラスのインスタンスをインスタンス化します。 新しいオブジェクトを $BasicTestObject 変数に保存します。

$BasicTestObject は、 Multiply メソッドを使用します。 整数が乗算され、積が表示されます。

例 2: 追加された型を調べる

この例では、 Get-Member コマンドレットを使用して、 Add-Type および New-Object コマンドレットが Example 1 で作成したオブジェクト調べます。

[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 コマンドレットは、セッションに追加Add-TypeBasicTest クラスの型とメンバーを取得します。 Get-Member コマンドは、System.Object クラスから派生した System.RuntimeType オブジェクトであることを示します。

Get-Member Static パラメーターは、BasicTest クラスの静的プロパティとメソッドを取得します。 出力は、 Add メソッドが含まれていることを示しています。

Get-Member コマンドレットは、$BasicTestObject変数に格納されているオブジェクトのメンバーを取得します。 $BasicTestObject は、 New-Object コマンドレットと BasicTest クラスを使用して作成されました。 出力により、 $BasicTestObject 変数の値が BasicTest クラスのインスタンスであり、 Multiply というメンバーが含まれていることが示されます。

例 3: アセンブリから型を追加する

次の使用例は、 Accessibility.dll アセンブリのクラスを現在のセッションに追加します。

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

$AccType変数には、Add-Type コマンドレットで作成されたオブジェクトが格納されます。 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-Type PassThru パラメーターによって作成されたオブジェクトが格納されます。 Add-Type コマンドレットは、ShowWindowAsync関数を静的メソッドとして PowerShell セッションに追加します。 このコマンドでは、 MemberDefinition パラメーターを使用して、 $Signature 変数に保存されるメソッド定義を指定します。 このコマンドでは、 Name パラメーターと Namespace パラメーターを使用して、クラスの名前と名前空間を指定します。 PassThru パラメーターは、型を表すオブジェクトを生成します。

新しい ShowWindowAsync 静的メソッドは、PowerShell コンソールを最小化および復元するためにコマンドで使用されます。 このメソッドは、ウィンドウ ハンドルと、ウィンドウの表示方法を指定する整数の 2 つのパラメーターを受け取ります。

PowerShell コンソールを最小限に抑えるために、ShowWindowAsyncは、$PID自動変数と共に Get-Process コマンドレットを使用して、現在の PowerShell セッションをホストしているプロセスを取得します。 次に、現在のプロセスの MainWindowHandle プロパティと、SW_MINIMIZE値を表す 2 の値を使用します。

ウィンドウを復元するには、 ShowWindowAsync ウィンドウの位置に 4 の値を使用します。これは、 SW_RESTORE 値を表します。

ウィンドウを最大化するには、SW_MAXIMIZEを表す3の値を使用します。

例 5: Visual Basic ファイルから型を追加する

この例では、Add-Type コマンドレットを使用して、Hello.vb ファイルで定義されている VBFromFile クラスを現在のセッションに追加します。 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 コマンドレットを使用して、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変数は、Loop メソッドを定義する F# コードを保存します。

$FSharpType変数には、$FSharpCodeで定義されているパブリック型を保存するAdd-Type コマンドレットの結果が格納されます。 TypeDefinition パラメーターは、型を定義するソース コードを指定します。 CodeDomProvider パラメーターは、ソース コード コンパイラを指定します。 PassThru パラメーターは、型を表す Runtime オブジェクトを返すようにAdd-Typeを指示します。 オブジェクトはパイプラインから Where-Object コマンドレットに送信され、パブリック型のみが返されます。 Where-Object コマンドレットは、F# プロバイダーが、結果のパブリック型をサポートするために非パブリック型を生成するため使用されます。

Loop メソッドは、 $FSharpType 変数に格納されている型の静的メソッドとして呼び出されます。

パラメーター

-AssemblyName

型を含むアセンブリの名前を指定します。 Add-Type は、指定したアセンブリから型を受け取ります。 このパラメーターは、アセンブリ名に基づいて型を作成する場合に必要です。

アセンブリの完全名または単純名 (部分名とも呼ばれます) を入力します。 アセンブリ名ではワイルドカード文字を使用できます。 単純名または部分名を入力した場合、 Add-Type は完全な名前に解決され、完全な名前を使用してアセンブリが読み込まれます。

Path または LiteralPath パラメーターを使用すると、読み込む予定のアセンブリが確実に読み込まれます。 AssemblyName パラメーターを使用すると、PowerShell は標準の .NET アセンブリ解決プロセスを使用してアセンブリ名を解決するように .NET に求めます。 .NET は最初にアプリケーション フォルダーを検索するため、 Add-Type は現在のフォルダー内のバージョンではなく、 $PSHOME からアセンブリを読み込む可能性があります。 詳細については、 Assembly の場所を参照してください。

.NET が名前の解決に失敗した場合、PowerShell は現在の場所を調べ、アセンブリを検索します。 AssemblyName パラメーターでワイルドカードを使用すると、.NET アセンブリ解決プロセスが失敗し、PowerShell が現在の場所を検索します。

型:String[]
Aliases:AN
配置:Named
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:True

-CodeDomProvider

コード ジェネレーターまたはコンパイラを指定します。 Add-Type は、指定されたコンパイラを使用してソース コードをコンパイルします。 既定値は C# コンパイラです。 Language パラメーターを使用して指定できない言語を使用している場合は、このパラメーターを使用します。 指定する CodeDomProvider は、ソース コードからアセンブリを生成できる必要があります。

型:CodeDomProvider
Aliases:Provider
配置:Named
規定値:C# compiler
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-CompilerParameters

ソース コード コンパイラのオプションを指定します。 これらのオプションは、リビジョンなしでコンパイラに送信されます。

このパラメーターを使用すると、実行可能ファイルの生成、リソースの埋め込み、 /unsafe オプションなどのコマンド ライン オプションの設定をコンパイラに指示できます。 このパラメーターは、 CompilerParameters クラス System.CodeDom.Compiler.CompilerParameters を実装します。

同じコマンドで CompilerParameters および ReferencedAssemblies パラメーターを使用することはできません。

型:CompilerParameters
Aliases:CP
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-IgnoreWarnings

コンパイラの警告は無視します。 Add-Typeがコンパイラ警告をエラーとして処理しないようにするには、このパラメーターを使用します。

型:SwitchParameter
配置:Named
規定値:False
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Language

ソース コードで使用される言語を指定します。 Add-Type コマンドレットは、このパラメーターの値を使用して、適切なCodeDomProviderを選択します。 CSharp が既定値です。 このパラメーターに使用できる値は次のとおりです。

  • CSharp
  • CSharpVersion2
  • CSharpVersion3
  • JScript
  • VisualBasic
型:Language
指定可能な値:CSharp, CSharpVersion2, CSharpVersion3, JScript, VisualBasic
配置:Named
規定値:CSharp
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-LiteralPath

型を含むソース コード ファイルまたはアセンブリ DLL ファイルへのパスを指定します。 Path とは異なり、LiteralPath パラメーターの値は、型指定されたとおりに使用されます。 ワイルドカードとして解釈される文字はありません。 パスにエスケープ文字が含まれている場合は、単一引用符で囲みます。 単一引用符は、エスケープ シーケンスとして文字を解釈しないように PowerShell に指示します。

Path または LiteralPath パラメーターを使用すると、読み込む予定のアセンブリが確実に読み込まれます。

型:String[]
Aliases:PSPath
配置:Named
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-MemberDefinition

クラスの新しいプロパティまたはメソッドを指定します。 Add-Type は、プロパティまたはメソッドをサポートするために必要なテンプレート コードを生成します。

Windows では、この機能を使用して、PowerShell でアンマネージ関数にプラットフォーム呼び出し (P/Invoke) 呼び出しを行うことができます。

型:String[]
配置:1
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Name

作成するクラスの名前を指定します。 メンバー定義から型を生成する場合は、このパラメーターは必須です。

型名と名前空間はセッション内で一意である必要があります。 型をアンロードしたり、変更したりすることはできません。 型のコードを変更するには、名前を変更するか、新しい PowerShell セッションを開始する必要があります。 それ以外の場合、コマンドは失敗します。

型:String
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Namespace

型の名前空間を指定します。

このパラメーターがコマンドに含まれていない場合、型は Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes 名前空間に作成されます。 パラメーターが空の文字列値または $Null の値を持つコマンドに含まれている場合、型はグローバル名前空間で生成されます。

型:String
Aliases:NS
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-OutputAssembly

その場所に指定した名前のアセンブリ DLL ファイルを生成します。 省略可能なパスとファイル名を入力します。 ワイルドカード文字を使用できます。 既定では、 Add-Type はメモリ内でのみアセンブリを生成します。

型:String
Aliases:OA
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:True

-OutputType

出力アセンブリの出力の種類を指定します。 既定では、出力の種類は指定されていません。 このパラメーターは、コマンドで出力アセンブリが指定されている場合にのみ有効です。 値の詳細については、「 OutputAssemblyType 列挙型を参照してください。

このパラメーターに使用できる値は次のとおりです。

  • ConsoleApplication
  • Library
  • WindowsApplication
型:OutputAssemblyType
Aliases:OT
指定可能な値:ConsoleApplication, Library, WindowsApplication
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-PassThru

追加された型を表す System.Runtime オブジェクトを返します。 既定では、このコマンドレットは出力を生成しません。

型:SwitchParameter
配置:Named
規定値:False
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-Path

型を含むソース コード ファイルまたはアセンブリ DLL ファイルへのパスを指定します。

ソース コード ファイルを送信する場合、 Add-Type はファイル内のコードをコンパイルし、型のメモリ内アセンブリを作成します。 Path の値で指定されたファイル拡張子によって、使用するコンパイラAdd-Type決定されます。

アセンブリ ファイルを送信する場合、 Add-Type はアセンブリから型を受け取ります。 メモリ内アセンブリまたはグローバル アセンブリ キャッシュを指定するには、 AssemblyName パラメーターを使用します。

型:String[]
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-ReferencedAssemblies

型が依存しているアセンブリを指定します。 既定では、 Add-TypeSystem.dllSystem.Management.Automation.dllを参照します。 既定のアセンブリに加え、このパラメーターを使用して指定されたアセンブリも参照されます。

同じコマンドで CompilerParameters および ReferencedAssemblies パラメーターを使用することはできません。

型:String[]
Aliases:RA
配置:Named
規定値:None
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-TypeDefinition

型定義を含むソース コードを指定します。 文字列またはヒア文字列のソース コードを入力するか、ソース コードを含む変数を入力します。 here-strings の詳細については、 about_Quoting_Rulesを参照してください。

型定義に、名前空間宣言を含めます。 名前空間の宣言を省略すると、型が別の型または別の型のショートカットと同名となり、意図しない上書きを引き起こす場合があります。 たとえば、Exception という型を定義すると、System.Exception のショートカットとして Exception を使用するスクリプトは失敗します。

型:String
配置:0
規定値:None
必須:True
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

-UsingNamespace

クラスに必要な他の名前空間を指定します。 これは、C# キーワード ( Using) とよく似ています。

既定では、 Add-TypeSystem 名前空間を参照します。 MemberDefinition パラメーターを使用すると、Add-Typeは既定で System.Runtime.InteropServices 名前空間も参照します。 UsingNamespace パラメーターを使用して追加する名前空間は、既定の名前空間に加えて参照されます。

型:String[]
Aliases:Using
配置:Named
規定値:System namespace
必須:False
パイプライン入力を受け取る:False
ワイルドカード文字を受け取る:False

入力

None

このコマンドレットにオブジェクトをパイプすることはできません。

出力

None

既定では、このコマンドレットは出力を返しません。

Type

PassThru パラメーターを使用すると、このコマンドレットは新しい型を表す System.Type オブジェクトを返します。

メモ

追加した型は、現在のセッションのみに存在します。 すべてのセッションで型を使用するには、PowerShell プロファイルに追加します。 プロファイルの詳細については、「 about_Profiles」を参照してください。

型名と名前空間は、セッション内で一意である必要があります。 型をアンロードしたり、変更したりすることはできません。 型のコードを変更する必要がある場合は、名前を変更するか、新しい PowerShell セッションを開始する必要があります。 それ以外の場合、コマンドは失敗します。

IronPython や J# などの一部の言語の CodeDomProvider クラスは出力を生成しません。 その結果、これらの言語で記述された型は、 Add-Typeでは使用できません。

このコマンドレットは、Microsoft .NET Framework CodeDomProvider クラスに基づいています。