2017-01-13 9 views
1

У меня есть ребенок работу в файле Test.ps1:Как получить одно имущество и выход из детской работы?

param($unit) 
$p = $unit 

Start-Job -Name $unit -ScriptBlock { 
    param($p) 

    "Hallo $p" 
    New-Object PSCustomObject -Property @{ 
     Not_found = "agurk" 
    } 
} -ArgumentList $p 

Когда я делаю:

PS> .\test 2 
PS> $a=Get-Job|Receive-Job |Select-Object -Property Not_found

Я, к сожалению, получить

PS> $a.count 
2

Почему 2 и не 1?

И я должен сделать

PS> $a[1].Not_found 
agurk

для того, чтобы получить значение.

Я хочу создать дочернее задание, которое производит некоторый вывод, и одно свойство, и только одно для вызывающего объекта для исследования. Как я могу это достичь?

ответ

0

Вы получаете счет 2, потому что ваше задание возвращает строку "Hallo 2" и ваш пользовательский объект @{Not_found="agurk"}. Из documentation:

В Windows PowerShell®, результаты каждого оператора возвращаются как выход, даже без заявления, содержащего ключевое слово Return.

Select-Object не пропускает или удалить эту строку, вместо этого он создает новый пользовательский объект с пустым свойством Not_found, так что вы в конечном итоге с результатом, как это:

[ 
    { 'Not_found': '' }, 
    { 'Not_found': 'agurk' } 
]

Если вы не хотят вывода строки для захвата, измените эту строку:

"Hallo $p" 

в это:

Write-Host "Hallo $p" 

Или не создавайте нежелательный выход в первую очередь.

Если требуется дополнительный выход, и вы должны иметь возможность перенаправлять его отдельно от возвращаемого объекта, вы не можете использовать Write-Host, хотя, поскольку этот командлет записывает непосредственно на консоль хоста (это означает, что его вывод не может быть захвачен или перенаправлен). Вместо этого вам нужно написать different stream, например. подробного вывода потока:

Write-Verbose "Hallo $p" 

Обратите внимание, что вам нужно PowerShell v3 или более поздней версии, чтобы иметь возможность перенаправлять отличных от успеха и ошибок потоков потоков.

+0

Хорошо, но выход нужен, поскольку вызывающий может перенаправить его в выходной файл. Но вызывающий объект также хочет определить значение свойства. Это действительно означает, что он должен перебирать все выходные данные, чтобы найти объект свойства? Это звучит громоздко. – user2304458

+0

Если вы хотите иметь возможность перенаправлять выходные данные отдельно от возвращаемого объекта, вам необходимо записать его в [другой поток] (https://blogs.technet.microsoft.com/heyscriptingguy/2014/03/30/ stream-streams-redirection-and-write-host-in-powershell /), например многословный поток ('Write-Verbose'). Обратите внимание, что PowerShell v3 или новее необходимо перенаправить потоки, отличные от потоков Success and Error. –

0

Кол-во дворов исходит из того, что задание возвращает две линии вывода, "Hallo $p" и объект.

Поскольку вы выполняете безусловный выбор, кажется, Powershell возвращает объекты независимо от того, существует ли свойство.

Вы можете изменить свой запрос, чтобы проверить, является ли свойство заселена с помощью Where-Object:

$a = Get-Job | Receive-Job | Where-Object { $_.Not_Found -match ".+" } 

Затем доступ с $a.Not_Found

С другой стороны, прямой доступ к собственности от вашего результата и, кажется, возвращайте непустые значения:

$a = $(Get-Job | Receive-Job | Select-Object -Property Not_Found).Not_Found 

 Смежные вопросы

  • Нет связанных вопросов^_^