В чем разница между WriteObject (x, true) и несколькими объектами записи при написании командлета PowerShell? - PullRequest
2 голосов
/ 24 мая 2011

Я хочу написать командлет, который считывает несколько записей из базы данных и помещает их в конвейер.

Я думаю, что я могу сделать либо один WriteObject(Enumerable<rec>, true), либо я могу зациклить себя и вызвать WriteObjectнесколько раз.

В чем разница между этими двумя?

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Вот документация: Метод Cmdlet.WriteObject (Object, Boolean)

А вот пример:

# 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 членами возвращаемого объекта.

1 голос
/ 18 июня 2011

Что ж, WriteObject(Object, boolean) позволит вам вывести коллекцию и оставить ее неизменной (если вызывается с «false» для второго аргумента).Обычно PowerShell будет перечислять любые коллекции, которые помещаются в конвейер.

Таким образом, вы можете вывести строковый массив, и результат будет иметь тип [String []].Хотя если вы позволите PowerShell развернуть его, он будет массивом строк в [Object []].

Вы также можете вызвать эту перегрузку с помощью «true», и это будет похоже на цикл, вызывающий WriteObject(Object).

...