次の方法で共有


6. 変換

編集メモ

重要

Windows PowerShell 言語仕様 3.0 は、2012 年 12 月に公開され、Windows PowerShell 3.0 に基づいています。 この仕様では、PowerShell の現在の状態は反映されません。 現在の状態を反映するようにこのドキュメントを更新する予定はありません。 このドキュメントは、履歴参照のためにここに示されています。

仕様文書は、Microsoft ダウンロード センターから Microsoft Word 文書として入手できます。https://www.microsoft.com/download/details.aspx?id=36389 Word 文書は、Microsoft Learn でプレゼンテーション用に変換されています。 変換中に、Docs プラットフォームの書式設定に対応するために、いくつかの編集の変更が行われました。 一部の入力ミスと軽微なエラーが修正されました。

型変換 は、1 つの型の値が別の型を必要とするコンテキストで使用されるときに実行されます。 このような変換が自動的に行われる場合は、暗黙的な変換と呼ばれます。 この一般的な例としては、オペランドによって指定された1つ以上の値を変換する必要がある演算子が挙げられます。暗黙の変換は、変換時に元の値の意味が保たれ、例えば数値の精度が失われない場合に許可されます。

キャスト演算子 (§7.2.9) では、''明示的な変換'' を行うことができます。

変換については、§6.19の各演算子の説明で必要に応じて補足情報を提供します。

値を既に持っている型に明示的に変換しても、その値またはその表現は変更されません。

式の値がパラメーターにバインドされているときに変換を渡す規則については、§6.17で説明します。

6.1 void への変換

任意の型の値は、void 型にキャストすることで明示的に破棄できます。 結果はありません。

6.2 ブールへの変換

任意の値をブール型に変換する規則は次のとおりです。

  • 0 の数値または文字の値は False に変換されます。0 以外の数値または文字の値が True に変換されます。
  • null 型の値は False に変換されます。
  • 長さ 0 の文字列は False に変換されます。長 > 0 の文字列が True に変換されます。
  • $true を持つ switch パラメーターは True に変換され、値 $false を持つスイッチ パラメーターは False に変換されます。
  • その他の null 以外の参照型の値はすべて True に変換されます。

型が IList を実装する場合:

  • オブジェクトの Length > 2 の場合、値は True に変換されます。
  • オブジェクトの Length が 1 で、最初の要素がそれ自体が IList でない場合、その要素の値が true の場合、値は True に変換されます。
  • それ以外の場合、最初の要素の Count >= 1 の場合、値は True に変換されます。
  • それ以外の場合、値は False に変換されます。

6.3 char への変換

任意の値を char 型に変換する規則は次のとおりです。

  • ブール型、10 進数型、浮動小数点数型、または double 型の値の変換にエラーが発生しています。
  • null 型の値は、null (U+0000) 文字に変換されます。
  • char 型で値を表すことができる整数型の値には、その値があります。それ以外の場合、変換はエラーになります。
  • 長さが 1 以外の文字列値の変換がエラーになります。
  • 長さが 1 の文字列値は、その 1 文字の値を持つ文字に変換されます。
  • 小数部の丸め後の値を変換先の型で表すことができる数値型の値には、その丸められた値が含まれます。それ以外の場合、変換はエラーになります。
  • その他の参照型の値の場合、参照型がそのような変換をサポートしている場合は、その変換が使用されます。それ以外の場合、変換はエラーになります。

6.4 整数への変換

任意の値を byte、int、または long 型に変換する規則は次のとおりです。

  • ブール値 False は 0 に変換されます。ブール値 True は 1 に変換されます。
  • 変換先の型で値を表すことができる char 型の値には、その値があります。それ以外の場合、変換はエラーになります。
  • 小数部の丸め後の値を変換先の型で表すことができる数値型の値には、その丸められた値が含まれます。それ以外の場合、変換はエラーになります。
  • null 型の値は 0 に変換されます。
  • 数値を表す文字列は、§6.16で説明されているように変換されます。 小数部を切り捨てた後、結果を変換先の型で表すことができる場合、文字列は整形式であり、変換先の型になります。それ以外の場合、変換はエラーになります。 文字列が数値を表していない場合、変換はエラーになります。
  • その他の参照型の値の場合、参照型がそのような変換をサポートしている場合は、その変換が使用されます。それ以外の場合、変換はエラーになります。

6.5 float と double への変換

任意の値を float 型または double 型に変換する規則は次のとおりです。

  • ブール値 False は 0 に変換されます。ブール値 True は 1 に変換されます。
  • char 値は正確に表されます。
  • 数値型の値は、可能であれば正確に表されます。ただし、int、long、および float への 10 進変換、および倍精度浮動小数点型への長整数変換と 10 進変換では、整数値の最下位ビットの一部が失われる可能性があります。
  • null 型の値は 0 に変換されます。
  • 数値を表す文字列は、§6.16で説明されているように変換されます。それ以外の場合、変換はエラーになります。
  • その他の参照型の値の場合、参照型がそのような変換をサポートしている場合は、その変換が使用されます。それ以外の場合、変換はエラーになります。

6.6 10 進数への変換

任意の値を decimal 型に変換する規則は次のとおりです。

  • ブール値 False は 0 に変換されます。ブール値 True は 1 に変換されます。
  • char 型の値は正確に表されます。
  • 数値型の値は正確に表されます。ただし、その値が大きすぎるか小さすぎて変換先の型に収まらない場合、変換はエラーになります。
  • null 型の値は 0 に変換されます。
  • 数値を表す文字列は、§6.16で説明されているように変換されます。それ以外の場合、変換はエラーになります。
  • その他の参照型の値の場合、参照型がそのような変換をサポートしている場合は、その変換が使用されます。それ以外の場合、変換はエラーになります。
  • 変換が成功した結果のスケールは、小数部に末尾のゼロが含まれないことを示します。

6.7 オブジェクトへの変換

null 型 (4.1.2) を除く任意の型の値を型オブジェクトに変換できます。 値は、その型と表現を保持します。

6.8 文字列への変換

任意の値を型文字列に変換する規則は次のとおりです。

  • $false ブール値は "False" に変換されます。$true ブール値が "True" に変換されます。
  • char 型の値は、その文字を含む 1 文字の文字列に変換されます。
  • 数値型の値は、対応する数値リテラルの形式を持つ文字列に変換されます。 ただし、結果には先頭または末尾のスペースがなく、先頭にプラス記号も付けず、整数の基数は 10 で、型サフィックスはありません。 10 進変換の場合は、スケールが保持されます。 ∞、+∞、および NaN の値の場合、結果の文字列はそれぞれ "-Infinity"、"Infinity"、および "NaN" になります。
  • null 型の値は空の文字列に変換されます。
  • 1 次元配列の場合、結果は、最初から最後までの配列内の各要素の値を含む文字列に変換され、要素は現在の出力フィールド区切り記号 (§2.3.2.2) で区切られます。 それ自体が配列である要素を持つ配列の場合、最上位の要素のみが変換されます。 配列である要素の値を表すために使用される文字列は、実装が定義されています。 多次元配列の場合、フラット化 (§9.12) され、1 次元配列として扱われます。
  • null 型の値は空の文字列に変換されます。
  • scriptblock 型の値は、{ 文字と } 文字を区切らずに、そのブロックのテキストを含む文字列に変換されます。
  • 列挙型の値の場合、結果はコンマで区切られた、その値でエンコードされた各列挙定数の名前を含む文字列になります。
  • その他の参照型の値の場合、参照型がそのような変換をサポートしている場合は、その変換が使用されます。それ以外の場合、変換はエラーになります。

配列である要素の値を表すために使用される文字列の形式は、System.Type[]System.Type[,]などです。 その他の参照型の場合は、ToString メソッドが呼び出されます。 他の列挙可能な型の場合、ソース値は 1 次元配列のように扱われます。

6.9 配列への変換

任意の値を配列型に変換する規則は次のとおりです。

  • ターゲット型が多次元配列でない場合があります。
  • null 型の値はそのまま保持されます。
  • $null 以外のスカラー値またはハッシュテーブル型の値の場合、ターゲット要素型への変換後のスカラー値を持つ新しい 1 要素配列が作成されます。
  • 1 次元配列値の場合、ターゲット型の新しい配列が作成され、各要素がソース配列からターゲット配列内の対応する要素に変換されてコピーされます。
  • 多次元配列値の場合、その配列は最初にフラット化され (§9.12)、次に 1 次元配列値として扱われます。
  • 文字列値は、配列内の対応する位置を占める文字列から連続する文字を持つ長さが同じ char の配列に変換されます。

他の列挙可能な型の場合、ターゲット要素型への変換後に値が対応する要素である新しい 1 要素配列が作成されます (そのような変換が存在する場合)。 それ以外の場合、変換はエラーになります。

6.10 xml への変換

オブジェクトは文字列型に変換され、xml型の XML Document オブジェクトに変換されます。

6.11 正規表現への変換

文字列型の値を指定する式は、regex型に変換できます。

6.12 scriptblock への変換

任意の値を型 scriptblock に変換する規則は次のとおりです。

  • 文字列値は、必要に応じて、そのコマンドの呼び出しに対する引数によって、コマンドの名前として扱われます。

6.13 列挙型への変換

任意の値を列挙型に変換するための規則は次のとおりです。

  • 列挙型の名前付き値 (大文字と小文字を区別) のいずれかを含む string 型の値は、その名前付き値に変換されます。
  • 列挙型の名前付き値 (大文字と小文字を区別) のコンマ区切りリストを含む string 型の値は、それらの名前付き値すべてのビット演算子 OR に変換されます。

6.14 他の参照型への変換

配列型または文字列以外の参照型に値を変換する規則は次のとおりです。

  • null 型の値はそのまま保持されます。
  • それ以外の場合、動作は実装定義です。

ここでは、さまざまな仕組みが関与しています。これには、値がハッシュテーブルである場合に、単一引数コンストラクターや既定のコンストラクターを使用できる可能性、暗黙的および明示的な変換演算子の利用、およびターゲット型の Parse メソッドの使用が含まれます。また、Convert.ConvertTo の使用や ETS 変換メカニズムを使うことも含まれます。

6.15 通常の算術変換

どちらのオペランドも数値型を持つ値を指定していない場合は、

  • 左オペランドがブール型の値を指定した場合、変換はエラーになります。
  • それ以外の場合、$null 値を指定するすべてのオペランドは int 型の 0 に変換され、プロセスは次に示す数値変換を続行します。
  • それ以外の場合、左オペランドが char 型の値を指定し、右オペランドがブール型の値を指定した場合、変換はエラーになります。
  • それ以外の場合、左オペランドが文字列型の値を指定するが、数値 (§6.16) を表していない場合、変換はエラーになります。
  • それ以外の場合、右オペランドが文字列型の値を指定するが、数値 (§6.16) を表さない場合、変換はエラーになります。
  • それ以外の場合、文字列型の値を指定するすべてのオペランドは数値 (§6.16) に変換され、プロセスは次に示す数値変換を続行します。
  • それ以外の場合、変換はエラーになります。

数値変換:

  • 1 つのオペランドが decimal 型の値を指定すると、必要に応じて、もう一方のオペランドによって指定された値がその型に変換されます。 結果の型は decimal です。
  • それ以外の場合、1 つのオペランドが double 型の値を指定した場合、もう一方のオペランドで指定された値は、必要に応じてその型に変換されます。 結果は double 型となります。
  • それ以外の場合、1 つのオペランドが float 型の値を指定した場合、両方のオペランドで指定された値は、必要に応じて double 型に変換されます。 結果は double 型となります。
  • それ以外の場合、一方のオペランドが long 型の値を指定すると、必要に応じて、もう一方のオペランド値によって指定された値がその型に変換されます。 結果には、値を表すことができる、シーケンスlong および double に最初にその型が含まれます。
  • それ以外の場合、両方のオペランドで指定された値は、必要に応じて int 型に変換されます。 結果には、切り捨てずに値を表すことができる、シーケンス int、long、double に最初のものが含まれます。

6.16 文字列から数値型への変換

文字列は、その内容に応じて、明示的または暗黙的に数値に変換できます。 具体的には

  • 空の文字列は、値 0 に変換されます。
  • 先頭と末尾のスペースは無視されます。ただし、文字列はスペースのみで構成することはできません。
  • 空白文字または行終端記号のみを含む文字列は、値 0 に変換されます。
  • 先頭に 1 つ + または - 記号を指定できます。
  • 整数には、16 進数のプレフィックス (0x または 0X) を指定できます。
  • 必要に応じて符号付き指数を使用できます。
  • 型サフィックスと乗数は使用できません。
  • 大文字と小文字を区別する文字列 "-Infinity"、"Infinity"、および "NaN" は、それぞれ -∞、+∞、および NaN の値として認識されます。

6.17 パラメーターバインド中の変換

パラメーター バインドの詳細については、§8.14を参照してください。

式の値がパラメーターにバインドされている場合、次に示すように、変換に関する追加の考慮事項があります。

  • パラメーターの型が switch(§4.2.5§8.10.5) であり、パラメーターに引数がない場合、呼び出されたコマンドのパラメーターの値は $trueに設定されます。 パラメーター型が switch 以外の場合、引数を持たないパラメーターがエラーになります。
  • パラメーターの型が switch で、引数の値が $null場合、パラメーター値は $falseに設定されます。
  • パラメーター型がオブジェクトの場合、または引数の型と同じ場合、引数の値は変換なしで渡されます。
  • パラメーター型がオブジェクトまたは scriptblock でない場合は、scriptblock 型を持つ引数が評価され、その結果が引数の値として渡されます。 (これは、遅延スクリプト ブロック バインドと呼ばれます)。パラメーター型が object または scriptblock の場合、scriptblock 型を持つ引数をそのまま渡します。
  • パラメーター型が T2 型のコレクションであり、引数が T1 型のスカラーである場合、そのスカラーは 1 つの要素を含む T2 型のコレクションに変換されます。 必要に応じて、スカラー値は、このセクションの変換規則を使用して T2 型に変換されます。
  • パラメーター型がオブジェクト以外のスカラー型で、引数がコレクションの場合、引数はエラーになります。
  • 予期されるパラメーター型が T2 型のコレクションであり、引数が T1 型のコレクションである場合、引数は引数コレクションと同じ長さの T2 型のコレクションに変換されます。 必要に応じて、引数コレクション要素の値は、このセクションの変換規則を使用して T2 型に変換されます。
  • 上記の手順とこの章で前述した変換で十分でない場合は、§6.18 の規則が適用されます。 失敗した場合、パラメーターのバインドは失敗します。

6.18 .NET 変換

暗黙的な変換では、PowerShell の組み込み変換が最初に試行されます。 変換を解決できない場合は、次の .NET カスタム コンバーターが上から下に順番に試行されます。 変換が検出されても、例外がスローされている場合、変換は失敗しています。

  • PSTypeConverter: PSTypeConverter クラスの実装をターゲット クラスに関連付ける方法は 2 つあります。型構成ファイル (types.ps1xml) を使用するか、System.ComponentModel.TypeConverterAttribute 属性をターゲット クラスに適用します。 詳細については、PowerShell SDK のドキュメントを参照してください。

  • TypeConverter: この CLR 型は、値の型を他の型に変換したり、標準値やサブプロパティにアクセスしたりするための統一された方法を提供します。 最も一般的なコンバーターの種類は、テキスト表現との間で変換されるコンバーターです。 クラスの型コンバーターは、System.ComponentModel.TypeConverterAttributeを使用してクラスにバインドされます。 この属性がオーバーライドされない限り、このクラスから継承するすべてのクラスは、基底クラスと同じ型コンバーターを使用します。 詳細については、PowerShell SDK と Microsoft .NET Framework のドキュメントを参照してください。

  • Parse メソッド: ソースの型が文字列で、変換先の型に Parseというメソッドがある場合、そのメソッドが呼び出されて変換が実行されます。

  • コンストラクター: 変換先の型に、ソース型の型である 1 つの引数を受け取るコンストラクターがある場合、そのコンストラクターが呼び出されて変換が実行されます。

  • 暗黙的キャスト演算子: 変換元の型に変換先の型に変換する暗黙的なキャスト演算子がある場合、その演算子が呼び出されて変換が実行されます。

  • 明示的なキャスト演算子: 変換元の型に変換先の型に変換する明示的なキャスト演算子がある場合、その演算子が呼び出されて変換が実行されます。 変換先の型に、変換元の型から変換する明示的なキャスト演算子がある場合は、変換を実行するためにその演算子が呼び出されます。

  • IConvertable: 変換を実行するために System.Convert.ChangeType が呼び出されます。

6.19 ordered への変換

任意の値を順序付けされた擬似型に変換する規則は次のとおりです。

  • 値がハッシュ リテラル (§2.3.5.6) の場合、結果はハッシュテーブルのように動作し、キーの順序がハッシュ リテラルで指定された順序と一致する実装定義型を持つオブジェクトになります。
  • それ以外の場合、動作は実装定義です。

ハッシュ リテラル (§2.3.5.6) のみを順序付けに変換できます。 結果は、System.Collections.Specialized.OrderedDictionaryのインスタンスです。

6.20 pscustomobject への変換

任意の値を擬似型 pscustomobject に変換する規則は次のとおりです。

  • ハッシュテーブル型の値は、PowerShell オブジェクトに変換されます。 ハッシュテーブル内の各キーは、対応する値を持つ NoteProperty になります。
  • それ以外の場合、動作は実装定義です。

変換は常に許可されますが、値の型は変更されません。