Функция не распознается при получении задания несколько раз в цикле - PullRequest
1 голос
/ 02 апреля 2019

Я впервые использую Джобса в powershell. Я поместил функцию в работу, и у меня есть цикл while, который отображает обратный отсчет ETA. Я хочу, чтобы обратный отсчет времени был приостановлен / скорректирован, если он достигает предварительно определенного времени, а функция еще не завершила обработку.

Я успешно создал обратный отсчет, но пробую варианты Receive-Job и Get-Job. Я также сделал глобальную переменную, которая изменяется от 0 до 1, когда функция завершается. В то время как цикл while просматривает переменную в бесконечном цикле, пока она не изменится

$Completion = "0"
$TWOLength = "10"
$ScanFunction = {InitiateScan -Type "Auto"}
$ScanJob = Start-Job -ScriptBlock $ScanFunction

$iTWO=1
Do {
    $TLlabel.Text = "Scanning Computer        ETA: "+$LoadProVal+" Seconds"
    $TLPB.Value = -($LoadProVal-$LoadProMax)
    $TLform.Refresh()
    $LoadProVal--
    $iTWO++
    $TLform.Refresh()
    Start-Sleep 1
}
While ($iTWO -le $TWOLength)

While ($Completion -ne "1"){
    #Do Loop Infinite until Variable Changes
    Receive-Job $ScanJob -Keep
    Write-Host $InitialScan
        Start-Sleep 5
}

Когда этот код выполняется, я получаю сообщение об ошибке The term 'InitiateScan' in not recognized, как только он начинает обрабатывать цикл Receive-Job $ScanJob -Keep. Если я поставлю Receive-Job перед циклом while, ошибка не произойдет, поэтому я добавил параметр -Keep

Желаемый конечный результат должен быть:
-старт сканирования в задании
-Начать обратный отсчет
-При достижении $TWOLength, проверить работу $Completion Переменная
-Если $Completion не 1, подождите и проверьте снова
-Если $Completion равно 1, завершите цикл и продолжайте

1 Ответ

1 голос
/ 02 апреля 2019
  • Для фонового задания, чтобы увидеть функцию , она должна быть определена как часть его блока сценария (или быть частью модуля автозагрузки / импортирована из модуля),

  • Фоновые задания выполняются как отдельные процессы PowerShell (которые не загружают пользователя $PROFILE).

Один из вариантов - передать определение функции в блок сценария для выполнения в фоновом режиме и переопределить там .
Обратите внимание, что вы должны аналогичным образом переопределить другие функции, если таковые имеются, чтоэта функция вызывает.

Упрощенный пример:

# Define the function to use in the background job.
function Initiate-Scan { "hi: $args" }

# Start the job and (re)define the function in the script block, via
# passing the function body as an argument.
$jb = Start-Job { 
  ${function:Initiate-Scan} = $args[0]; Initiate-Scan -Type Auto 
} -Args ${function:Initiate-Scan}

# Get the job's output.
Receive-Job $jb -Wait -AutoRemoveJob

Выше приведено hi: -Type Auto, демонстрирующее, что функция была успешно переопределена в фоновом задании.

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