这是我第一次在Powershell中使用Jobs。我已将一个函数放入作业中,并且有一个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
While循环,就会收到错误消息Receive-Job $ScanJob -Keep
。
如果我将Receive-Job
放在While循环之前,则不会发生错误,这就是为什么我添加了-Keep参数
所需的最终结果应为:
-在作业中开始扫描
-开始倒计时
-到达$TWOLength
时,检查作业$Completion
变量
-如果$Completion
不为1,请等待并再次检查
-如果$Completion
为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
,表明该函数已在后台作业中成功重新定义。