运行定时作业并将值返回到父窗体

时间:2015-03-04 16:43:17

标签: powershell jobs

我对PowerShell和编程的整体世界还很陌生,我已经开展了一个项目来帮助我学习。我正在尝试构建一个函数,将正在运行的进程列表与应该运行的列表进行比较。然后,该函数将返回“On”或“Off”的对象。以下是我目前编写的内容,但是现在我需要把它变成一个每隔几秒运行一次的工作。请问任何人都可以帮忙吗?非常感谢任何帮助。

function CheckRunningProcessesFunc
{
    $Processes = (Get-Variable InclusionList).Value.CheckedItems #List of proceese to check if they are on or off
    $RunningProcesses = Get-WMIObject Win32_Process -filter "Name='adc.exe' OR Name='optask.exe'" | select -expand path #current running processes
    foreach ($Process in $Processes)
    {
        $TimeNow = get-date -Format ‘HH:mm:ss’
        $Text = $TimeNow + " " + $Process
        if ($RunningProcesses -contains $Process)
        {
            $Result = $Text + ' is On'
            (Get-Variable ListBox).Value.Items.Add($Result)
        }
        else
        {
            $Result = $Text + ' is Off'
            (Get-Variable ListBox).Value.Items.Add($Result)
        }
    }
}

1 个答案:

答案 0 :(得分:1)

从您的评论中,您似乎正在使用PowerShell编写.NET GUI。这是一种非常罕见的方法,因为PowerShell本质上是一种脚本语言。要保持GUI响应能力,您必须始终避免阻止代码并依赖事件处理和回调函数等技术。这不是PowerShell构建要处理的东西。

由于PS是基于.NET框架构建的,因此没有什么可以阻止您实例化内置对象(如Stopwatch类),但要​​使其与PS交互以满足需要花费大量的工作。

我的建议是,如果你想使用WinForms,那么使用C#。然后,如果您想利用PowerShell的一些优势,您可以使用整个System.Management.Automation命名空间。