我正在尝试编写用于监视作业的PowerShell 5.1脚本。我在写一个合适的"获得工作"表时遇到了问题,以下是我的问题。
Get-Job | Format-Table -AutoSize -Property name, state, @{name = 'Runtime'; Expression = {$((get-date)-($_.psbegintime)).ToString('HH:mm')}}
此代码返回的是一个命名作业和状态的表,但确实填充了运行时列。如果我从代码中删除.ToString('HH:mm')
,但它会在运行时列中填充小时:分钟:秒:毫秒,格式为HH:mm:ss:ffffffff。如何删除"秒"one_answers"毫秒"部分?
.ToString(HH:mm)
不工作的原因是:的结果
Get-Date - $_.PSBeginTime
不是datetime
对象,而是timespan
对象。在timespan
对象上调用.ToString(HH:mm)
会引发以下异常:
MethodInvocationException:异常调用"ToString";用";1〃;自变量:";输入字符串的格式不正确">
根据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
这个答案显示了一个类似的、更为开发的替代方案,使用一个函数等待有进度的Jobs和一个可选的TimeOut参数。