about_Enum
簡単な説明
enum
ステートメントは列挙型を宣言します。 列挙型は、列挙子リストと呼ばれる名前付きラベルのセットで構成される個別の型です。
詳細な説明
enum
ステートメントを使用すると、厳密に型指定されたラベルのセットを作成できます。 コード内でその列挙型を使用すると、スペル ミスを解析またはチェックする必要はありません。
列挙型は、開始値が 0 の整数値型として内部的に表されます。 PowerShell 列挙では、基になる型として System.Int32 ([int]
) が使用されます。 既定では、PowerShell はリスト内の最初のラベルに値 0 を割り当てます。 既定では、PowerShell は残りのラベルに連続する整数を割り当てます。
定義では、ラベルに任意の整数値を指定できます。 値が割り当てられていないラベルは、次の整数値を受け取ります。
構文
列挙型では、次の構文が使用されます。
整数列挙定義の構文
[[<attribute>]...] enum <enum-name> {
<label> [= <int-value>]
...
}
フラグ列挙定義の構文
[[<attribute>]...] [Flag()] enum <enum-name>[ : <underlying-type-name>] {
<label 0> [= 1]
<label 1> [= 2]
<label 2> [= 4]
<label 3> [= 8]
...
...
}
列挙アクセス構文
[<enum-name>]::<label>
例
例 1 - 最小列挙
次のコード ブロックは、3 つのラベルを持つ MarkdownUnorderedListCharacter 列挙体を定義します。 どのラベルにも明示的な値は割り当てられません。
enum MarkdownUnorderedListCharacter {
Asterisk
Dash
Plus
}
次のコード ブロックは、列挙型にキャストするときに整数と文字列の両方の値がどのように動作するかを示しています。
$ValuesToConvert = @(0, 'Asterisk', 1, 'Dash', 2, 'Plus')
foreach ($Value in $ValuesToConvert) {
[MarkdownUnorderedListCharacter]$EnumValue = $Value
[pscustomobject]@{
AssignedValue = $Value
Enumeration = $EnumValue
AreEqual = $Value -eq $EnumValue
}
}
AssignedValue Enumeration AreEqual
------------- ----------- --------
0 Asterisk True
Asterisk Asterisk True
1 Dash True
Dash Dash True
2 Plus True
Plus Plus True
列挙型の値と等しい整数をキャストすると、その列挙型が返されます。 列挙体のラベルと同じ文字列をキャストすると、その列挙型が返されます。
例 2 - 明示的な列挙値とシノニム列挙値
次の例は、メディア ファイルに関連付けられるオブジェクトの列挙体を示しています。 定義は、 music
、 picture
、 video
の基になる値に明示的な値を割り当てます。 明示的な割り当ての直後のラベルは、次の整数値を取得します。 同じ値を別のラベルに割り当てることで、シノニムを作成できます。 ogg
、 oga
、 mogg
、 jpg
、 jpeg
、または mpg
、 mpeg
の構成値を参照してください。
enum MediaTypes {
unknown
music = 10
mp3
aac
ogg = 15
oga = 15
mogg = 15
picture = 20
jpg
jpeg = 21
png
video = 40
mpg
mpeg = 41
avi
m4v
}
GetEnumNames()
メソッドは、列挙体のラベルの一覧を返します。
[MediaTypes].GetEnumNames()
unknown
music
mp3
aac
ogg
oga
mogg
picture
jpg
jpeg
png
video
mpg
mpeg
avi
m4v
GetEnumValues()
メソッドは、列挙体の値の一覧を返します。
[MediaTypes].GetEnumValues()
unknown
music
mp3
aac
oga
oga
oga
picture
jpeg
jpeg
png
video
mpeg
mpeg
avi
m4v
Note
GetEnumNames()
と GetEnumValues()
は同じ結果を返すように見えます。名前付き値のリストです。 ただし、内部的には、 GetEnumValues()
は値を列挙し、値を名前にマップします。 一覧をよく読んで、GetEnumNames()
の出力にogg
、oga
、mogg
が表示されますが、GetEnumValues()
の出力にはoga
のみが表示されます。 jpg
、jpeg
、mpg
、mpeg
でも同じことが起こります。 シノニム値に対して PowerShell から返される名前は決定論的ではありません。
GetEnumName()
メソッドを使用して、特定の値に関連付けられた名前を取得できます。 値に複数の名前が関連付けられている場合、メソッドはアルファベット順の名を返します。
[MediaTypes].GetEnumName(15)
oga
次の例は、各名前をその値にマップする方法を示しています。
[MediaTypes].GetEnumNames() | ForEach-Object {
[pscustomobject]@{
Name = $_
Value = [int]([MediaTypes]::$_)
}
}
Name Value
---- -----
unknown 0
music 10
mp3 11
aac 12
ogg 15
oga 15
mogg 15
picture 20
jpg 21
jpeg 21
png 22
video 40
mpg 41
mpeg 41
avi 42
m4v 43
構文 [<enum-name>]::<label>
を使用して、ラベルによって単一の列挙値を指定できます。
[MediaTypes]::png
[MediaTypes]::png -eq 22
png
True
例 3 - フラグとしての列挙
次のコード ブロックは、 FileAttributes 列挙体をビット フラグのセットとして作成します。 各ラベルの値は、前のラベルの値の 2 倍です。
[Flags()] enum FileAttributes {
Archive = 1
Compressed = 2
Device = 4
Directory = 8
Encrypted = 16
Hidden = 32
}
[FileAttributes]$file1 = [FileAttributes]::Archive
[FileAttributes]$file1 += [FileAttributes]::Compressed
[FileAttributes]$file1 += [FileAttributes]::Device
"file1 attributes are: $file1"
[FileAttributes]$file2 = [FileAttributes]28 ## => 16 + 8 + 4
"file2 attributes are: $file2"
file1 attributes are: Archive, Compressed, Device
file2 attributes are: Device, Directory, Encrypted
特定のフラグが設定されているかどうかをテストするには、二項比較演算子 -band
を使用できます。 この例では、 Device と Archive 属性を $file2
の値でテストします。
PS > ($file2 -band [FileAttributes]::Device) -eq [FileAttributes]::Device
True
PS > ($file2 -band [FileAttributes]::Archive) -eq [FileAttributes]::Archive
False
HasFlag()
メソッドを使用して、特定のフラグが設定されているかどうかをテストすることもできます。
この例では、 Device および Hidden 属性を $file1
の値でテストします。
PS > $file1.HasFlag([FileAttributes]::Device)
True
PS > $file1.HasFlag([FileAttributes]::Hidden)
False
例 4 - パラメーターとしての列挙
次の例では、関数ConvertTo-LineEndingRegex
は、EndOfLine 型で InputObject パラメーターを定義します。
enum EndOfLine {
CR = 1
LF = 2
CRLF = 3
}
function ConvertTo-LineEndingRegex {
[CmdletBinding()]
param (
[Parameter(ValueFromPipeline)]
[EndOfLine[]]$InputObject
)
process {
switch ($InputObject) {
CR { '\r' }
LF { '\n' }
CRLF { '\r\n' }
}
}
}
[EndOfLine]::CR | ConvertTo-LineEndingRegex
'CRLF' | ConvertTo-LineEndingRegex
ConvertTo-LineEndingRegex 2
\r
\r\n
\n
この例では、 ConvertTo-LineEndingRegex
を呼び出す最初のステートメントは、 CR
の列挙値を渡します。 2 番目のステートメントは、文字列 'CRLF'
を渡します。これは、 LineEnding にキャストされます。 3 番目のステートメントは、パラメーターの値 2
を指定します。これは、 LF
ラベルにマップされます。
PowerShell プロンプトに次のテキストを入力すると、引数の入力候補オプションを確認できます。
ConvertTo-LineEndingRegex -InputObject <Tab>
パラメーターに無効なラベル名または数値を指定すると、エラーが発生します。
ConvertTo-LineEndingRegex -InputObject 0
ConvertTo-LineEndingRegex : Cannot process argument transformation on
parameter 'InputObject'. Cannot convert value "0" to type "EndOfLine[]".
Error: "Cannot convert value "0" to type "EndOfLine" due to enumeration
values that are not valid. Specify one of the following enumeration values
and try again. The possible enumeration values are "CR,LF,CRLF"."
At line:1 char:40
+ ConvertTo-LineEndingRegex -InputObject 0
+ ~
+ CategoryInfo : InvalidData: (:) [ConvertTo-LineEndingRegex]
, ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Convert
To-LineEndingRegex
列挙メソッド
次の一覧には、PowerShell の列挙体で使用できる便利なメソッドとその使用方法が含まれています。
形式
Format()
静的メソッドは、指定された列挙型、列挙値、および書式指定文字列の書式設定された文字列出力を返します。 出力は、指定した書式指定文字列を使用して値に対して ToString メソッドを呼び出すのと同じです。
System.Enum 基底クラス型または特定の列挙型で静的メソッドを使用できます。
[System.Enum]::format([<enum-name>], <value>, <format-string>)
[<enum-name>]::format([<enum-name>], <value>, <format-string>)
有効な書式指定文字列は、 G
または g
、 D
または d
、 X
または x
、および F
または f
です。 詳細については、「 Enumeration 書式指定文字列」を参照してください。
次の例では、サポートされている各列挙型書式指定文字列を使用して、 TaskState 列挙の各値をその文字列形式に変換します。
enum TaskState {
ToDo
Doing
Done
}
# String format template for the statements
$Statement = "[System.Enum]::Format([TaskState], {0}, '{1}')"
foreach ($Format in @('G', 'D', 'X', 'F')) {
$StatementToDo = $Statement -f 0, $Format
$StatementDoing = $Statement -f "([TaskState]'Doing')", $Format
$StatementDone = $Statement -f '[TaskState]::Done', $Format
$FormattedToDo = [System.Enum]::Format(
[TaskState], 0, $Format
)
$FormattedDoing = [System.Enum]::Format(
[TaskState], ([TaskState]'Doing'), $Format
)
$FormattedDone = [System.Enum]::Format(
[TaskState], [TaskState]::Done, $Format
)
"{0,-62} => {1}" -f $StatementToDo, $FormattedToDo
"{0,-62} => {1}" -f $StatementDoing, $FormattedDoing
"{0,-62} => {1}" -f $StatementDone, $FormattedDone
}
[System.Enum]::Format([TaskState], 0, 'G') => ToDo
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'G') => Doing
[System.Enum]::Format([TaskState], [TaskState]::Done, 'G') => Done
[System.Enum]::Format([TaskState], 0, 'D') => 0
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'D') => 1
[System.Enum]::Format([TaskState], [TaskState]::Done, 'D') => 2
[System.Enum]::Format([TaskState], 0, 'X') => 00000000
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'X') => 00000001
[System.Enum]::Format([TaskState], [TaskState]::Done, 'X') => 00000002
[System.Enum]::Format([TaskState], 0, 'F') => ToDo
[System.Enum]::Format([TaskState], ([TaskState]'Doing'), 'F') => Doing
[System.Enum]::Format([TaskState], [TaskState]::Done, 'F') => Done
GetEnumName
GetEnumName()
リフレクション メソッドは、特定の列挙値の名前を返します。 入力値は、整数や列挙値などの列挙型の有効な基になる型である必要があります。 値に複数の名前が関連付けられている場合、メソッドはアルファベット順の名を返します。
[<enum-name>].GetEnumName(<value>)
enum GateState {
Unknown
Open
Opening
Closing
Closed
}
foreach ($Value in 0..4) {
[pscustomobject]@{
IntegerValue = $Value
EnumName = [GateState].GetEnumName($Value)
}
}
IntegerValue EnumName
------------ --------
0 Unknown
1 Open
2 Opening
3 Closing
4 Closed
GetEnumNames
GetEnumNames()
リフレクション メソッドは、すべての列挙値の名前を文字列として返します。 出力にはシノニムが含まれます。
[<enum-name>].GetEnumNames()
enum Season {
Unknown
Spring
Summer
Autumn
Winter
Fall = 3
}
[Season].GetEnumNames()
Unknown
Spring
Summer
Fall
Autumn
Winter
GetEnumUnderlyingType
GetEnumUnderlyingType()
リフレクション メソッドは、列挙値の基になる型を返します。
[<enum-name>].GetEnumUnderlyingType()
enum IntBasedEnum {
Zero
One
Two
}
$NonIntEnum = [System.Management.Automation.Tracing.PowerShellTraceKeywords]
foreach ($EnumType in @([IntBasedEnum], $NonIntEnum)) {
[pscustomobject]@{
EnumType = $EnumType
ValueType = $EnumType.GetEnumUnderlyingType()
}
}
EnumType ValueType
-------- ---------
IntBasedEnum System.Int32
System.Management.Automation.Tracing.PowerShellTraceKeywords System.UInt64
GetEnumValues
GetEnumValues()
リフレクション メソッドは、列挙型に対して定義されたすべての値を返します。
[<enum-name>].GetEnumValues()
enum Season {
Unknown
Spring
Summer
Autumn
Winter
Fall = 3
}
[Season].GetEnumValues()
Unknown
Spring
Summer
Autumn
Autumn
Winter
HasFlag
HasFlag
インスタンス メソッドは、フラグ列挙値にビット フラグが設定されているかどうかを判断します。 このメソッドを使用すると、バイナリ比較と等価性チェックを行うよりも、短く読みやすくなっています。
<enum-value>.HasFlag(<enum-flag-value>)
次の例では、 ModuleFeatures フラグ列挙体を定義し、 39
の値にどのフラグを設定するかを示します。
[Flags()] enum ModuleFeatures {
Commands = 1
Classes = 2
Enums = 4
Types = 8
Formats = 16
Variables = 32
}
$Features = [ModuleFeatures]39
foreach ($Feature in [ModuleFeatures].GetEnumValues()) {
"Has flag {0,-12}: {1}" -f "'$Feature'", ($Features.HasFlag($Feature))
}
Has flag 'Commands' : True
Has flag 'Classes' : True
Has flag 'Enums' : True
Has flag 'Types' : False
Has flag 'Formats' : False
Has flag 'Variables' : True
IsDefined
IsDefined()
静的メソッドは、入力値が列挙型に対して定義されている場合は$true
を返し、それ以外の場合は$false
。 このメソッドを使用して、無効な引数エラーを処理しなくても、列挙に対して値が有効かどうかを確認します。
System.Enum 基底クラス型または特定の列挙型で静的メソッドを使用できます。
[System.Enum]::IsDefined([<enum-name>], <value>)
[<enum-name>]::IsDefined([<enum-name>], <value>)
enum Season {
Unknown
Spring
Summer
Autumn
Winter
Fall = 3
}
foreach ($Value in 0..5) {
$IsValid = [Season]::IsDefined([Season], $Value)
$EnumValue = if ($IsValid) { [Season]$Value }
[pscustomobject] @{
InputValue = $Value
IsValid = $IsValid
EnumValue = $EnumValue
}
}
InputValue IsValid EnumValue
---------- ------- ---------
0 True Unknown
1 True Spring
2 True Summer
3 True Autumn
4 True Winter
5 False
ToString
ToString()
インスタンス メソッドは、列挙値のラベルを返します。
このメソッドは、列挙値が出力として表示される方法の既定のビューでもあります。 必要に応じて、値の表示方法を制御する書式指定文字列を指定できます。 書式設定の詳細については、「 列挙値の書式設定」を参照してください。
Note
特定の値のシノニムを定義する列挙型の場合は、 ToString()
の出力に依存するコードを記述しないでください。 このメソッドは、値の任意の有効な名前を返すことができます。
<enum-value>.ToString([<format-string>])
次の例では、Grey
のシノニムとしてGray
を持つShade列挙体を定義します。 次に、実際の列挙値、文字列としての列挙型、および列挙型を整数として示すオブジェクトを出力します。
enum Shade {
White
Grey
Gray = 1
Black
}
[Shade].GetEnumValues() | Foreach-Object -Process {
[pscustomobject]@{
EnumValue = $_
StringValue = $_.ToString()
IntegerValue = [int]$_
}
}
numValue StringValue IntegerValue
--------- ----------- ------------
White White 0
Grey Grey 1
Grey Grey 1
Black Black 2
列挙値のシノニム
同じ整数値に異なる名前を付ける列挙型を定義できます。 その場合、同じ基になる値を指す名前は synonyms と呼ばれます。 シノニムを持つ列挙型を使用すると、ユーザーは同じ値に異なる名前を指定できます。
シノニムを持つ列挙型を定義するときは、特定の名前変換するシノニム値に依存するコードを記述しないでください。 シノニム文字列を列挙値に変換するコードを確実に記述できます。 列挙値自体を操作するときは、常に文字列としてではなく、列挙値またはその基になる型として比較します。
次のコード ブロックでは、Grey
とGray
をシノニムとして使用してShade列挙体を定義します。
enum Shade {
White
Grey
Gray = 1
Black
}
[Shade]'Grey' -eq [Shade]::Gray
[Shade]::Grey -eq 1
[Shade]'Gray' -eq 1
True
True
True
フラグとしての列挙型
列挙型の一般的な用途の 1 つは、相互に排他的な値のセットを表すことです。 たとえば、 ArrivalStatus インスタンスの値は、Early、OnTime、または Late にすることができます。 ArrivalStatus インスタンスの値が複数の列挙定数を反映しても意味がありません。
ただし別の場合、列挙オブジェクトの値には複数の列挙体メンバーを含めることができ、各メンバーは列挙値のビットフィールドを表します。 FlagsAttribute を使用して、列挙体がユーザーが組み合わせることができるフラグとしてビット フィールドで構成されていることを示すことができます。
フラグとしての列挙型が正しく機能するためには、各ラベルの整数値を 2 の累乗に設定する必要があります。 ラベルの値を指定しない場合、PowerShell は値を前のラベルより 1 つ高いものに設定します。
一般的に使用されるフラグの組み合わせの値を定義して、ユーザーが一度にフラグのセットを簡単に指定できるようにすることができます。 値の名前は、フラグの結合名にする必要があります。 整数値は、フラグ値の合計である必要があります。
特定のフラグが値に設定されているかどうかを判断するには、値に対して HasFlag()
メソッドを使用するか、二項比較演算子 -band
を使用します。
フラグ列挙体の使用方法とフラグが設定されているかどうかを確認する方法を示すサンプルについては、 Example 3 を参照してください。
パラメーターとしての列挙型
列挙型を型として使用するコマンドレット パラメーターを定義できます。 パラメーターの型として列挙型を指定すると、ユーザーはパラメーターの値の自動補完と検証を受け取ります。 引数の入力候補は、列挙型の有効なラベルの一覧を示します。
パラメーターの型として列挙型がある場合は、次のいずれかを指定できます。
- 次のような列挙体
[<EnumType>]::<Label>
- 文字列としての列挙体のラベル
- 列挙体の数値
列挙型パラメーターの動作を示すサンプルについては、 Example 4を参照してください。
列挙値の書式設定
静的 Format メソッドと、インスタンス ToString メソッドのオーバーロードを呼び出すことによって、列挙値を文字列形式に変換できます。 書式指定文字列を使用して、列挙値を文字列として表す正確な方法を制御できます。 詳細については、「 Enumeration 書式指定文字列」を参照してください。
次の例では、サポートされている各列挙型書式指定文字列 (G
または g
、 D
または d
、 X
または x
、および F
または f
) を使用して、 TaskState 列挙の各メンバーをその文字列表現に変換します。
enum TaskState {
ToDo
Doing
Done
}
[TaskState].GetEnumValues() | ForEach-Object {
[pscustomobject]@{
"ToString('G')" = $_.ToString('G')
"ToString('D')" = $_.ToString('D')
"ToString('X')" = $_.ToString('X')
"ToString('F')" = $_.ToString('F')
}
}
ToString('G') ToString('D') ToString('X') ToString('F')
------------- ------------- ------------- -------------
ToDo 0 00000000 ToDo
Doing 1 00000001 Doing
Done 2 00000002 Done
次の例では、フラグ列挙の値に書式指定文字列を使用します。
[Flags()] enum FlagEnum {
A = 1
B = 2
C = 4
}
$FlagValues = @(
[FlagEnum]::A # 1
[FlagEnum]::B # 2
[FlagEnum]::A + [FlagEnum]::B # 3
[FlagEnum]::C # 4
[FlagEnum]::C + [FlagEnum]::A # 5
[FlagEnum]::C + [FlagEnum]::B # 6
[FlagEnum]::C + [FlagEnum]::A + [FlagEnum]::B # 7
[FlagEnum]::C + [FlagEnum]::C # 8
)
foreach ($Value in $FlagValues) {
[pscustomobject]@{
"ToString('G')" = $Value.ToString('G')
"ToString('D')" = $Value.ToString('D')
"ToString('X')" = $Value.ToString('X')
"ToString('F')" = $Value.ToString('F')
}
}
ToString('G') ToString('D') ToString('X') ToString('F')
------------- ------------- ------------- -------------
A 1 00000001 A
B 2 00000002 B
A, B 3 00000003 A, B
C 4 00000004 C
A, C 5 00000005 A, C
B, C 6 00000006 B, C
A, B, C 7 00000007 A, B, C
8 8 00000008 8
フラグ列挙の場合、 G
および F
書式指定文字列には、コンマで区切られた値のセット フラグの一覧が表示されます。 最後の値 ( 8
) では、実際には有効なフラグ セットではないため、フラグは一覧表示されません。 列挙フラグを組み合わせて、少なくとも 1 つのフラグを複製せずに 8
の合計を取得することはできません。
Update-TypeData を使用した拡張メソッドの定義
列挙型の宣言でメソッドを定義することはできません。 列挙体の機能を拡張するには、 Update-TypeData コマンドレットを使用して、列挙型 ScriptMethod
メンバーを定義できます。
次の例では、 Update-TypeData
コマンドレットを使用して、 GetFlags()
メソッドを FileAttributes フラグ列挙型に追加します。 値に設定されたフラグの配列を返します。
[Flags()] enum FileAttributes {
Archive = 1
Compressed = 2
Device = 4
Directory = 8
Encrypted = 16
Hidden = 32
}
$MemberDefinition = @{
TypeName = 'FileAttributes'
MemberName = 'GetFlags'
MemberType = 'ScriptMethod'
Value = {
foreach ($Flag in $this.GetType().GetEnumValues()) {
if ($this.HasFlag($Flag)) { $Flag }
}
}
}
Update-TypeData @MemberDefinition
$File = [FileAttributes]28
$File.GetFlags()
Device
Directory
Encrypted
型アクセラレータを使用した列挙型のエクスポート
既定では、PowerShell モジュールは、PowerShell で定義されているクラスと列挙型を自動的にエクスポートしません。 カスタム型は、 using module
ステートメントを呼び出さずにモジュールの外部では使用できません。
ただし、モジュールが型アクセラレータを追加した場合、ユーザーがモジュールをインポートした後、それらの型アクセラレータはすぐにセッションで使用できます。
Note
型アクセラレータをセッションに追加するには、内部 (パブリックではない) API を使用します。 この API を使用すると、競合が発生する可能性があります。 モジュールのインポート時に同じ名前の型アクセラレータが既に存在する場合、次に示すパターンではエラーがスローされます。 また、セッションからモジュールを削除すると、型アクセラレータも削除されます。
このパターンにより、セッションで型を使用できるようになります。 VS Code でスクリプト ファイルを作成する場合、IntelliSense や入力候補には影響しません。
VS Code でカスタム型の IntelliSense と入力候補を取得するには、スクリプトの先頭に using module
ステートメントを追加する必要があります。
次のパターンは、PowerShell クラスと列挙型をモジュールの型アクセラレータとして登録する方法を示しています。 任意の型定義の後に、ルート スクリプト モジュールにスニペットを追加します。 $ExportableTypes
変数に、ユーザーがモジュールをインポートするときに使用できるようにする各型が含まれていることを確認します。 他のコードでは、編集は必要ありません。
# Define the types to export with type accelerators.
$ExportableTypes =@(
[DefinedTypeName]
)
# Get the internal TypeAccelerators class to use its static methods.
$TypeAcceleratorsClass = [psobject].Assembly.GetType(
'System.Management.Automation.TypeAccelerators'
)
# Ensure none of the types would clobber an existing type accelerator.
# If a type accelerator with the same name exists, throw an exception.
$ExistingTypeAccelerators = $TypeAcceleratorsClass::Get
foreach ($Type in $ExportableTypes) {
if ($Type.FullName -in $ExistingTypeAccelerators.Keys) {
$Message = @(
"Unable to register type accelerator '$($Type.FullName)'"
'Accelerator already exists.'
) -join ' - '
throw [System.Management.Automation.ErrorRecord]::new(
[System.InvalidOperationException]::new($Message),
'TypeAcceleratorAlreadyExists',
[System.Management.Automation.ErrorCategory]::InvalidOperation,
$Type.FullName
)
}
}
# Add type accelerators for every exportable type.
foreach ($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Add($Type.FullName, $Type)
}
# Remove type accelerators when the module is removed.
$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
foreach($Type in $ExportableTypes) {
$TypeAcceleratorsClass::Remove($Type.FullName)
}
}.GetNewClosure()
ユーザーがモジュールをインポートすると、セッションの型アクセラレータに追加された型は、IntelliSense と完了にすぐに使用できます。 モジュールが削除されると、型アクセラレータも削除されます。
PowerShell モジュールから列挙型を手動でインポートする
Import-Module
および #requires
ステートメントは、モジュールによって定義されているモジュール関数、エイリアス、変数のみをインポートします。 列挙型はインポートされません。
モジュールがクラスと列挙型を定義しているが、それらの型に型アクセラレータを追加しない場合は、 using module
ステートメントを使用してそれらをインポートします。
using module
ステートメントは、スクリプト モジュールまたはバイナリ モジュールのルート モジュール (ModuleToProcess
) からクラスと列挙型をインポートします。 入れ子になったモジュールで定義されているクラスや、ルート モジュールにドット ソース化されたスクリプトで定義されているクラスは、一貫してインポートされません。 ルート モジュール内のモジュール外のユーザーが直接使用できるようにするクラスを定義します。
using
ステートメントの詳細については、about_Usingを参照してください。
開発中に新しく変更されたコードを読み込む
スクリプト モジュールの開発中は、コードを変更してから、Force パラメーターを使用してImport-Module
を使用して新しいバージョンのモジュールを読み込むのが一般的です。 これは、ルート モジュール内の関数に対する変更に対してのみ機能します。 Import-Module
では、入れ子になったモジュールは再読み込みされません。 また、更新されたクラスを読み込む方法はありません。
最新バージョンを確実に実行するには、新しいセッションを開始する必要があります。
PowerShell で定義され、 using
ステートメントでインポートされたクラスと列挙型はアンロードできません。
もう 1 つの一般的な開発方法は、コードを異なるファイルに分割することです。 別のモジュールで定義された列挙型を使用する関数がある場合は、 using module
ステートメントを使用して、関数に必要な列挙定義があることを確認する必要があります。
制限事項
特定の基になる型を持つ列挙体を Windows PowerShell で定義することはできません。 基になる型の System.Int32 を持つ列挙型のみを定義できます。
回避策: PowerShell 6.2 以降を使用します。 PowerShell 6.2 以降では、特定の基になる型を持つ列挙型を定義できます。
PowerShell で定義されている列挙値を属性で装飾することはできません。 列挙をビット フラグのセットとして定義する場合は、 FlagsAttribute と同様に、列挙宣言自体のみを装飾できます。
回避策: なし
列挙定義内でメソッドを定義することはできません。また、PowerShell では C# のような [拡張メソッド] の定義はサポートされていません。
回避策: Update-TypeData コマンドレットを使用して、列挙型のメンバー
ScriptMethod
定義します。
PowerShell