我试图在后台工作中查看进程,但我认为我不能正确理解PowerShell中的后台处理。我假设这是因为我的剧本不想工作。
$target = "firefox"
$Watch = {
while (1) {
sleep -Milliseconds 100
if(!((get-process $target -ErrorAction SilentlyContinue).Responding -eq $true))
{
Get-Job -name $target | Stop-Job
break
}
}
}
Start-Job -Name $target -ScriptBlock $Watch
在我看来,这个脚本应该控制"响应"我的" firefox"的财产处理每100毫秒,如果firefox挂起或关闭,它应该停止后台作业。
如果我执行此脚本然后关闭我的firefox进程,则Job仍在运行。它似乎并不关心我的Stop-Job
命令。
如果我执行这个scipt没有这样的任何工作,它就像一个魅力。
$target = "firefox"
while (1) {
sleep -Milliseconds 100
if(!((get-process $target -ErrorAction SilentlyContinue).Responding -eq $true))
{
Write-Host "Hello"
break
}
}
如果我使用作业运行此脚本,并在控制台中执行get-job -name $target | stop-job
部分,它也可以。所以它只是不想在作为后台工作运行时执行我的if () {scriptblock}
。
在后台作业中运行循环是不可能的吗?
答案 0 :(得分:1)
你正试图在工作中停止工作......这是不可能的
使用不同进程ID的PowerShell作业完全分离,即使从作业接收数据,数据也是“反序列化”,这意味着它不是真正的对象只是它的副本。
因此,如果您的目的是在firefox进程没有响应时停止作业,您可以创建一个这样的简单作业:
虽然这个过程正在响应而不是......
// Treat false as NULL to support binding false to checkboxes.
// Don't convert NULL to a string here in order to determine later
// whether an empty value has been submitted or whether no value has
// been submitted at all. This is important for processing checkboxes
// and radio buttons with empty values.
if (false === $submittedData) {
$submittedData = null;
} elseif (is_scalar($submittedData)) {
$submittedData = (string) $submittedData;
}