データベースから複数のレコードを読み取り、それらをパイプラインに入れるコマンドレットを作成したいと考えています。
WriteObject(Enumerable<rec>, true)
1 回だけでも、自分自身をループさせてWriteObject
複数回呼び出すこともできると思います。
これら2つの違いは何ですか?
データベースから複数のレコードを読み取り、それらをパイプラインに入れるコマンドレットを作成したいと考えています。
WriteObject(Enumerable<rec>, true)
1 回だけでも、自分自身をループさせてWriteObject
複数回呼び出すこともできると思います。
これら2つの違いは何ですか?
ドキュメントは次のとおりです。 Cmdlet.WriteObject メソッド (オブジェクト、ブール値)
そして、ここに例があります:
# Writes objects one by one
function Test1
{
[CmdletBinding()]param()
$data | %{ $PSCmdlet.WriteObject($_) }
}
# Writes the collection and allows the core to enumerate it one level.
# Numbers of written objects is the collection item count.
function Test2
{
[CmdletBinding()]param()
$PSCmdlet.WriteObject($data, $true)
}
# Writes the collection as a single object.
# Numbers of written objects is 1.
function Test3
{
[CmdletBinding()]param()
$PSCmdlet.WriteObject($data, $false)
}
function Test
{
(Test1).GetType().Name
(Test2).GetType().Name
(Test3).GetType().Name
}
$data = New-Object System.Collections.ArrayList
Write-Host "1 item"
$null = $data.Add('hello')
Test
Write-Host "2+ items"
$null = $data.Add('world')
Test
出力:
1 item
String
String
ArrayList
2+ items
Object[]
Object[]
ArrayList
したがって、コレクション内の各アイテムの呼び出しは、基本的に;WriteObject(item)
と同じです。WriteObject(items, true)
どちらの場合も、コレクション自体はなくなりました。
WriteObject(items, false)
異なります; コレクションへの参照を返し、呼び出し元はシナリオに応じてそれを効果的に使用できます。たとえば、コレクションがDataTable
オブジェクト (アンロールされたDataRow
アイテムのセットではない) である場合、呼び出し元DataTable
は返されたオブジェクトのメンバーを操作できます。
コレクションWriteObject(Object, boolean)
を出力し、そのままにしておくことができます (2 番目の引数に "false" を指定して呼び出した場合)。通常、PowerShell は、パイプラインに配置されるすべてのコレクションを列挙します。
したがって、文字列配列を出力すると、結果は [String[]] 型になります。一方、PowerShell にアンラップさせると、[Object[]] 内の文字列の配列になります。
そのオーバーロードを「true」で呼び出すこともできます。これは、ループ呼び出しのようになりますWriteObject(Object)
。