[英]How to pass argument to a function from a pipe output of another using powershell
我已經編寫了一個名為Wait-UntilJobFailOrSuccess的函數。 這使用管道命令行從Get-Job獲取輸出。 例如。
Get-Job|Remove-Job
我想為自己的功能做同樣的事情。 例如
Get-Job | Wait-UntilJobFailOrSuccess
我還在下面附加了Wait-UntilJobFailOrSuccess。 請告訴我們。 有誰對此有解決方案。
Function Wait-UntilJobFailOrSuccess
{
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
[System.Object[]]$jobs
)
while ($true) {
if ('Failed' -in $jobs.State) {
$jobs | Stop-Job
Write-Host "Aborting Jobs ${result}"
break
}
Start-Sleep -Milliseconds 500
}
foreach ($job in $jobs) {
if ($job.State -eq 'Failed') {
Write-Host ($job.ChildJobs[0].JobStateInfo.Reason.Message) -ForegroundColor Red
} else {
Write-Host (Receive-Job $job) -ForegroundColor Green
}
}
$jobs|remove-Job
}
解決方案究竟是什么? 您還沒有提出問題。
無論如何,在您的代碼中將您的參數“ Jobs”命名為[ValueFromPipelineByPropertyName]
。 作業對象沒有Jobs
屬性,因此將無法使用。 為此考慮一個單獨的參數Id
。 另外,不要將參數鍵入為[object[]]
,而是將其鍵入為[System.Management.Automation.Job[]]
,這是作業對象的類型。
您應該在process
塊中具有邏輯以累積所有Job
對象,然后在收集end
所有作業后將循環移至end
塊。
我已經重新格式化了您的代碼並對其進行了一些清理,但是我仍然無法弄清您實際上要做什么:
Function Wait-UntilJobFailOrSuccess
{
[CmdletBinding()]
param(
[Parameter(Mandatory, ValueFromPipeline)]
[System.Management.Automation.Job[]]
$jobs
)
begin
{
$joblist = @()
}
process
{
$joblist += $jobs
}
end
{
foreach ($job in $joblist)
{
if ($job.State -eq 'Failed')
{
Stop-Job -Job $job
Write-Host "Aborting Job $(job.name)"
break
}
}
Start-Sleep -Milliseconds 500
foreach ($job in $jobslist)
{
if ($job.State -eq 'Failed')
{
Write-Host ($job.ChildJobs[0].JobStateInfo.Reason.Message) -ForegroundColor Red
}
else
{
Write-Host (Receive-Job $job) -ForegroundColor Green
}
}
$joblist | Remove-Job -Force # Is this what you really want to do?
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.