循环多次接收作业时无法识别功能

时间:2019-04-02 16:28:08

标签: powershell

这是我第一次在Powershell中使用Jobs。我已将一个函数放入作业中,并且有一个while循环显示了ETA倒计时。我希望倒数计时器在达到预定时间且功能尚未完成处理时暂停/调整。

我已经成功创建了倒计时,但是尝试使用Receive-JobGet-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 While循环,就会收到错误消息Receive-Job $ScanJob -Keep。 如果我将Receive-Job放在While循环之前,则不会发生错误,这就是为什么我添加了-Keep参数

所需的最终结果应为:
-在作业中开始扫描
-开始倒计时
-到达$TWOLength时,检查作业$Completion变量
-如果$Completion不为1,请等待并再次检查
-如果$Completion为1,则结束循环并继续

1 个答案:

答案 0 :(得分:1)

  • 要让后台作业查看功能,必须将其定义为脚本块的一部分(或作为自动加载模块的一部分/从模块导入)。

  • 背景作业作为单独的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,表明该函数已在后台作业中成功重新定义。