Powershell для получения работы - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь узнать о том, как правильно использовать 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, я получаю только реальные детали процесса, когда использую Get-Member- $Alldatasets, кажется, нигде нет, но, запустив скрипт .ps1, я написал его - он публикует $Alldatasets. Я просто не могу получить $Alldatasets от receive-job.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Я понял это. Это не было проблемой передачи объекта. Это был вопрос каталога.

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

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
0 голосов
/ 28 июня 2018

Вы должны использовать Start-Job, чтобы иметь возможность использовать 'Receive-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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...