我正在尝试编写一个 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(使用前将#替换为@)