接收作业Powershell

时间:2018-06-28 12:54:24

标签: powershell

我正在尝试学习如何正确使用Receive-Job。我的目标是从本质上开始工作,然后运行像这样的事情:

$Alldatasets = [PSCustomobject]@{}

$Alldatasets = if(Test-Path "Alldatasets"){
  Get-ChildItemContent "Alldatasets" | ForEach {$_.Content | Add-Member @{Name = $_.Name} -PassThru} | Where Location -EQ $Location | Where {$Dataset.Count -eq 0 -or (Compare-Object $Dataset $_.Name -IncludeEqual -ExcludeDifferent | Measure).Count -gt 0}
}

$Alldatasets

然后将输出$Alldatasets返回到主脚本,您看不到它,但是它将是一个自定义对象表。

我了解receive-job的过程,但是并没有真正的教程式如何使用它来返回我在以上示例中创建的自定义对象表。使用wait-job | receive-job时,我似乎只得到了实际的过程详细信息,尽管似乎没有用,但是运行我在其中编写的.ps1脚本-它发布了Get-Member- $Alldatasets。我只是无法从$Alldatasets获得$Alldatasets

2 个答案:

答案 0 :(得分:1)

您必须使用Start-Job才能使用“接收作业”。而且,如果要在其中使用变量,则必须将其作为参数传递,因为本质上是在旋转一个新的进程/线程,并且它将无法访问局部变量。因此,参数块。

$ScriptBlock = {
    param(
        [Parameter (Mandatory=$true,
                    Position = 0)]
        $Location,
        [Parameter (Mandatory=$true,
                    Position = 1)]
        $DataSet
    )
    $Alldatasets = [PSCustomobject]@{}

    $Alldatasets = if(Test-Path "Alldatasets"){
                        Get-ChildItemContent "Alldatasets" | ForEach {$_.Content | Add-Member @{Name = $_.Name} -PassThru} | Where Location -EQ $Location |
                        Where {$Dataset.Count -eq 0 -or (Compare-Object $Dataset $_.Name -IncludeEqual -ExcludeDifferent | Measure).Count -gt 0}}

    Return $Alldatasets
}

Start-Job -ScriptBlock $ScriptBlock -ArgumentList $Location, $DataSet -Name "MyCustomJob"
$Alldatasets = Get-Job -Name "MyCustomJob" | Wait-Job | Receive-Job

答案 1 :(得分:0)

我知道了。这不是传递对象的问题。这是目录问题。

在我发现的任何教程中都没有告诉您,因此在此进行说明。

Start-Job在启动时未指定位置。我上面的脚本执行了Test-Path命令,并假设它是在原始工作目录中启动的。我必须指定一个工作目录才能使脚本工作:

$ScriptBlock = {
    param(
        [Parameter (Mandatory=$true,
                    Position = 0)]
        $Location,
        [Parameter (Mandatory=$true,
                    Position = 1)]
        $WorkingDir,
        [Parameter (Mandatory=$true,
                    Position = 3)]
        $DataSet
    )

    Set-Location "$WorkingDir"
    $Alldatasets = [PSCustomobject]@{}

    $Alldatasets = if(Test-Path "Alldatasets"){
                        Get-ChildItemContent "Alldatasets" | ForEach {$_.Content | Add-Member @{Name = $_.Name} -PassThru} | Where Location -EQ $Location |
                        Where {$Dataset.Count -eq 0 -or (Compare-Object $Dataset $_.Name -IncludeEqual -ExcludeDifferent | Measure).Count -gt 0}}

    Return $Alldatasets
}

Start-Job -ScriptBlock $ScriptBlock -ArgumentList $Location, $DataSet, $WorkingDir -Name "MyCustomJob"
$Alldatasets = Get-Job -Name "MyCustomJob" | Wait-Job | Receive-Job