当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 清理 PowerShell 作业

作者:精品下载站 日期:2024-12-14 08:03:59 浏览:17 分类:玩电脑

清理 PowerShell 作业


[玩转系统] 清理 PowerShell 作业

我是 PowerShell 工作的重度用户。不仅是后台作业,还有计划作业。它们是我日常工作流程中的关键要素。每次运行作业(尤其是计划作业)时,都会保留一个作业工件,您可以使用 Get-Job 查看该工件。对于计划作业,我尝试通过使用 Register-ScheduledJob 指定 MaxResultCount 将其保持在最低限度。我很少需要检查工作结果,但我喜欢能够看到工作结果。然而,所有这一切仍然带来了大量的就业机会。这是我日常驾驶时的感受。

[玩转系统] 清理 PowerShell 作业

一方面,这确实没什么大不了的。这些作业不会消耗太多磁盘空间或内存,如果我需要对某些问题进行故障排除,那么获得这些信息会很好。不过,能够清理掉这个问题可能还是不错的。我可以用一行命令轻松删除所有作业。

 Get-Job | where state -ne running | Remove-Job

但是,我想留下至少一两个最新的工作结果,这样我就可以监控一切。对于此任务,我编写了一个 PowerShell 函数。

#requires -version 5.1

#remove all but the newest X number of jobs based on the job name.

Function Remove-OldJob {
    [cmdletbinding(SupportsShouldProcess)]
    [OutputType("None", "Job")]
    Param(
        [Parameter(Position = 0, HelpMessage = "Specify the newest number of jobs to save for each job name. The max is 10.")]
        [ValidateRange(1, 10)]
        [int]$Newest = 1,
        [Parameter(HelpMessage = "Display the revised job list")]
        [switch]$Passthru
    )
    Write-Verbose "Starting $($myinvocation.MyCommand)"
    Write-Verbose "Saving the newest $newest job result(s)"
    Write-Verbose "Group all jobs that aren't running by their name"
    $jobs = Get-Job | Where-Object state -NE running | Group-Object -Property Name
    if ($jobs) {
        foreach ($item in $jobs) {
            if ($item.count -gt $Newest) {
                Write-Verbose "Processing $($item.count) total jobs for $($item.name)"
                $item.group | Sort-Object psendtime -Descending | Select-Object -Skip $Newest | Remove-Job
            } #foreach item
            else {
                Write-Verbose "Skipping job $($item.name)"
            }
        }
    } #if jobs
    else {
        Write-Warning "No jobs found."
    }

    if ($Passthru) {
        Get-Job | Sort-Object -Property Name
    }
    Write-Verbose "Ending $($myinvocation.MyCommand)"
}

该功能的工作原理是按名称对作业结果进行分组。

[玩转系统] 清理 PowerShell 作业

我编写了一个函数来获取一个参数,该参数指示我想要保留多少个最新作业。对于每个组,如果计数等于或高于此值,我将按作业组的结束时间对作业组进行排序,跳过指定数量的作业并将其删除。

$jobs = Get-Job | Where-Object state -NE running | Group-Object -Property Name
if ($jobs) {
    foreach ($item in $jobs) {
        if ($item.count -gt $Newest) {
            Write-Verbose "Processing $($item.count) total jobs for $($item.name)"
            $item.group | Sort-Object psendtime -Descending | Select-Object -Skip $Newest | Remove-Job
        } #foreach item
        else {
            Write-Verbose "Skipping job $($item.name)"
        }
    }
} #if jobs

因为我要更改系统的状态,所以我将 SupportsShouldProcess 添加到 cmdletbinding 属性中。因为Remove-Job 支持-WhatIf,所以我不必编写任何特殊的代码。当我使用 -WhatIf 运行命令时,首选项将传递给 Remove-Job。

[玩转系统] 清理 PowerShell 作业

然后我可以运行命令并清理作业列表。

[玩转系统] 清理 PowerShell 作业

-Passthru 参数获取剩余作业并按名称排序显示它们。通常,我不会在函数中包含排序,但在本例中,排序后的结果可以轻松验证结果。在本例中,每个指定作业的作业结果不超过 2 个。

您可能不需要清理旧的工作结果,但希望我的代码中有一些东西可以在您自己的工作中使用。一如既往,欢迎提出意见和问题。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯