Get-Job Format-Table with Runtimes of Jobs

Get-Job Format-Table with Runtimes of Jobs

我正在尝试编写用于监视作业的 PowerShell 5.1 脚本。 我在编写正确的 Get-Job 时遇到问题 table,以下是我所拥有的。

Get-Job | Format-Table -AutoSize -Property name, state, @{name = 'Runtime'; Expression = {$((get-date)-($_.psbegintime)).ToString('HH:mm')}}

此代码 returns 是一个 table 命名作业和状态,但确实填充了运行时列。如果我从代码中删除 .ToString('HH:mm') 但它会以 Hour:Minute:Second:Millisecond 以这种格式 HH:mm 填充运行时列,它会起作用: ss:fffffff。如何删除秒和毫秒部分?

.ToString(HH:mm) 不起作用的原因是:

Get-Date - $_.PSBeginTime

不是 datetime object, it's a timespan 对象。在 timespan 对象上调用 .ToString(HH:mm) 会引发以下异常:

MethodInvocationException: Exception calling "ToString" with "1" argument(s): "Input string was not in a correct format."

根据 TimeSpan.ToString MS Docs 格式化是可能的,但是格式是 .ToString('hh\:mm\:ss')

这里有一个示例,说明如何实现您正在寻找的内容:

$testJobs = 5

$jobs = 1..$testJobs | ForEach-Object {
    Start-Job {
        'Hello from Job {0}' -f $using:_
        Start-Sleep ([random]::new().Next(5,10))
    }
}
 
while($jobs.State -contains 'Running')
{
    Clear-Host
    Get-Job | Format-Table -AutoSize -Property Name, State, @{
        Name = 'Runtime'
        Expression = {
            ([datetime]::Now - $_.PSBeginTime).ToString('hh\:mm\:ss')
            # .ToString('hh\:mm') for Hours and Minutes only.
        }
    }
    Start-Sleep 1
 }
 
$jobs | Receive-Job -Wait -AutoRemoveJob

显示了一个类似的、更发达的替代方案,使用一个函数来等待有进度的作业和一个可选的 TimeOut参数。