我有一些工作,我想要一个不错的输出。当前使用的是:
Get-Job | Format-Table -Property name, state, @{n = 'Started'; e = {$($_.psbegintime).tostring("HH:mm:ss")}}, @{n = 'Completed'; e = {$($_.psendtime).tostring("HH:mm:ss")}}
我想再用
n = 'Elapsed'
创建一列。如果作业正在运行,则应计算
$(get-date) - $_.psbegintime
如果工作完成,则应计算
$_.psendtime - $_.psbegintime
我尝试了
$(if ($_.state -ieq "running") {$(get-date) - $_.psbegintime} {$_.psendtime - $_.psbegintime})
,但是它的输出很奇怪:{00:00:05.0532890, $($_.psendtime - $_.psbegintime)}
。我以为可以替换
$_.psendtime
值(null
)的($_.psendtime, get-date)[0]
原因,但是我又失败了。谢谢您的帮助!
最佳答案
正如@rokumaru指出的那样,您在表达式中缺少else
块,因此您将返回scriptblock
而不是返回加以及if
语句结果(如果成功)的结果。
我建议您分解代码以使其更具可读性(尤其是在脚本中):
#requires -Version 4
$prop = @{
'PipelineVariable' = 'job'
'Property' = @(
'Name', 'State'
@{ Name = 'Started'; Expression = { $job.PSBeginTime.ToString('HH:mm:ss') } }
@{ Name = 'Completed'; Expression = { $job.PSEndTime.ToString('HH:mm:ss') } }
@{
Name = 'Elapsed'
Expression = {
if ($job.State -eq 'Running') {
((Get-Date) - $job.PSBeginTime).ToString('HH:mm:ss')
}
else {
($job.PSEndTime - $job.PSBeginTime).ToString('HH:mm:ss')
}
}
}
)
}
Get-Job | Format-Table @prop
about_CommonParameters
:请参阅PipelineVariable
about_Splatting
Calculated Properties
:请参见Property
参数。