PowerShell后台作业处理while循环

时间:2016-02-22 09:31:32

标签: powershell jobs

我试图在后台工作中查看进程,但我认为我不能正确理解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}

在后台作业中运行循环是不可能的吗?

1 个答案:

答案 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;
}