1. ホーム
  2. powershell

[解決済み] OutVariableを使用してArrayListを作成する

2022-02-08 18:22:25

質問

このようなことが起こる正当な理由があると思うのですが、それが何なのかわかりません。 次のようなコードがあります。

$Deleted = $Items[0].ParentNode.RemoveChild($Items[0])
Write-Output $Deleted

このコードを

Do-Something -OutVariable Test

期待通りに画面上と変数に出力されるのですが、変数が ArraryList の型である単一の要素を持つ XmlElement

その代わりに

$Test = Do-Something

予想通り画面には出力されず、返された出力は1つのオブジェクトで、型は XmlElement

なぜ OutVariableArrayList を返すのではなく、関数が返す単一の項目を返すのですか?

ありがとうございます。

解決方法は?

PowerShell [Core] 7.0時点の情報です。

  • PowerShell が予期せず ではない をアンラップして、コマンドの シングル -オブジェクトの出力に
    -OutVariable
    : つまり、たとえあるコマンドが オブジェクトを作成すると、そのオブジェクトは予期せず 配列 (配列リスト) に渡されるターゲット変数で、その変数名が共通パラメータ -OutVariable パラメータ(またはそのエイリアス。 -ov ).

  • さらに ターゲット変数に格納される値の型は常に [System.Collections.ArrayList] の場合、配列 リスト である。 一貫性がない によってマルチオブジェクトの出力を変数に取り込むこととは異なります。 正規の割り当て となり、その結果 System.Object[] , a レギュラー 配列 .

参照 このGitHubの課題 .

ここで 簡潔なテスト で、この問題を実証しています。

$null = Get-Date -OutVariable ov; $ov.GetType().FullName

上記のバージョンでは、このように出力されます。

System.Collections.ArrayList

が出力されるだけであるにもかかわらず、(概念的な)出力は シングル [datetime] ( [System.DateTime] ) のインスタンスです。

通常の課題とは対照的です。 $v = Get-Date; $v.GetType().FullName 収穫 System.DateTime .


ワークアラウンド は、出力変数の参照を部分式演算子でラップして ( $(...) この場合、通常の出力(成功)ストリームを経由した場合と同じ出力が得られます。

  • 単一要素のコレクションがアンラップされる(要素そのもののみ出力)
  • 複数要素のコレクションは System.Object[] の配列です。
# Note the $(...) around $ov
PS> $null = Get-Date -OutVariable ov; $($ov).GetType().FullName
System.DateTime  # 1-element System.Collections.ArrayList unwrapped

もちろん $ov[0] もし、単一の出力オブジェクトしか期待しないのであれば。

この回避策は、複数要素の出力にも有効であることを示すものです。

PS> $null = Get-ChildItem / -OutVariable ov; $($ov).GetType().FullName
System.Object[] # multi-element System.Collections.ArrayList converted to array