获取作业格式表以及作业的运行时间

2024-04-30

我正在尝试编写一个 PowerShell 5.1 脚本来监视作业。 我在编写正确的“获取工作”表时遇到问题,以下是我所拥有的。

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

此代码返回的是命名作业和状态的表,但填充了运行时列。如果我删除它就可以了.ToString('HH:mm')来自代码,但填充了运行时列时:分:秒:毫秒以这种格式时:分:秒:ffffffff。如何删除秒和毫秒部分?


之所以.ToString(HH:mm)不起作用是因为以下结果:

Get-Date - $_.PSBeginTime

不是一个datetime https://learn.microsoft.com/en-us/dotnet/api/system.datetime?view=net-6.0对象,它是一个timespan https://learn.microsoft.com/en-us/dotnet/api/system.timespan?view=net-6.0目的。呼唤.ToString(HH:mm) on a timespan对象抛出以下异常:

MethodIncationException:使用“1”个参数调用“ToString”时出现异常:“输入字符串的格式不正确。”

根据TimeSpan.ToString MS 文档 https://learn.microsoft.com/en-us/dotnet/api/system.timespan.tostring?view=net-6.0#system-timespan-tostring格式化是可能的,但是格式是.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

这个答案 https://stackoverflow.com/a/71918903/15339544显示出类似的,更发达的替代方案,使用一个函数来等待有进度的作业和一个可选的TimeOut范围。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取作业格式表以及作业的运行时间 的相关文章

随机推荐