1

カスタム types.ps1xml ファイルを使用して、カスタム オブジェクトの型を拡張しようとしています。ファイルは機能し、多くのタイプを希望どおりに拡張します。

$true のブール値を持つ NoteProperty を使用して、カスタム タイプを拡張することができました。ここで実行できるようにしたいのは、TypeName の値が System.Boolean で、Value が $false の別の型に NoteProperty を追加することだけです。私の問題は、<value>プロパティが常に文字列として解釈され、System.Boolean の TypeName としてキャストされると、長さがゼロでない文字列が $true を返すため、常に $true を返すことです。

仕事に戻ろうと急いで電話でこれを入力していますが、ps1xml ファイルの関連部分は次のとおりです。

<Type>
  <Name>My.Custom.Object</Name>
  <Members>
    <NoteProperty>
      <Name>PSIsContainer</Name>
      <TypeName>System.Boolean<TypeName>
      <Value>True</Value>
    </NoteProperty>
  </Members>
</Type>

これにより、ブール値 $true を反映する NoteProperty が正しく生成されます。ただし、値を false、0、null、''、または ""、または $false、または [bool]0、または引用符の有無にかかわらず、または $ の有無にかかわらず、または内部のその他の実行可能な値に変更すると、 $() またはエスケープされた引用符または文字を使用。常に $true のブール値として返されます。空白のまま<Value>にすると、xml の読み込み時にエラーが発生するため、それも機能しません。<TypeName>を System.IO.File などの別のものに変更すると、実際には「false」の値が「false」という名前のファイル オブジェクト、または で特定した型に変換されます<TypeName>。$false のブール値を割り当てることができないことを除けば、意図したとおりに機能することは明らかです。私が何をしようと。離れたら<TypeName>完全に System.String にデフォルト設定されているため、役に立ちません。

ファイルまたはディレクトリの Get-Member を見ると、対応する PSIsContainer の NoteProperty が $true または $false の System.Boolean 値に等しいことがわかります。true に設定した場合の出力は、デフォルトのディレクトリ オブジェクトとまったく同じです。これは、NoteProperty を $false に設定できるはずであることを示唆しています。

ほとんど忘れていましたが、実際には、Add-Member を使用して NoteProperty を追加し、値を適切に $false に設定できますが、スクリプト/ツールが機能するには、このオブジェクトのすべてのインスタンスにこの NoteProperty が必要です。 types.ps1xml ファイルを使用することが、私が考えられる唯一の方法です。

このプロパティを設定しているオブジェクトは、その名前または値を持つ競合するプロパティや既存のプロパティを持たないカスタム オブジェクトです。<Name>そして、「IsAwesome」のように を別のものに変更しても問題ありません。$false ではまだ機能しません。既存の types.ps1xml と format.ps1xml を検索してみましたが、その方法についてのヒントはありません。私は何日もの間、オンラインで広範囲に検索してきましたが、Powershell に関するいくつかの教科書を見ても役に立ちませんでした。

誰か助けてくれませんか!?

4

1 に答える 1