当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 格式化 PowerShell 时间跨度

作者:精品下载站 日期:2024-12-14 07:59:10 浏览:16 分类:玩电脑

格式化 PowerShell 时间跨度


我经常会弄清楚如何做某事,但几个月后却很难记住如何做。与其试图记住我写了哪一段代码,不如写下来。假设我还记得!无论如何,今天的“PSRemembery”就是这样。

我经常使用这样的代码,我希望你们中的许多人也这样做。

$os = Get-CimInstance win32_operatingsystem
$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={(Get-Date) - $_.lastbootuptime}}

[玩转系统] 格式化 PowerShell 时间跨度

我将创建一个具有该时间跨度值的变量。

$up = (Get-Date) - $os.lastbootuptime

正如您所看到的,timespan 对象有一个 ToString() 方法,PowerShell 在为我格式化结果时使用该方法。

[玩转系统] 格式化 PowerShell 时间跨度

事实证明我可以使用这个方法来格式化字符串来满足我的需求。但这很棘手,这是我总是忘记的部分。您可以使用区分大小写的标记。

[玩转系统] 格式化 PowerShell 时间跨度

这消除了毫秒值,但有点难以破译。我可以将其他文本位添加到格式字符串中,但我必须告诉 PowerShell 将它们视为文字字符串。

$up.ToString("dd\.hh\:mm\:ss")

我插入标点符号是为了使时间跨度更易于阅读。

[玩转系统] 格式化 PowerShell 时间跨度

如果我想包括毫秒到小数点后两位,我也可以这样做。让我们更进一步。我知道有些人喜欢看到包含“天”、“小时”和“分钟”(或某些变体)的字符串作为输出的一部分。我也能做到。这里有一些例子。

$up.ToString("dd'dy:'hh'hr:'mm'min:'ss'sec'")
$up.ToString("dd' days 'hh' hours 'mm' minutes 'ss' seconds'")

我没有转义标点符号,而是将文本放在单引号中,告诉 PowerShell 不要将其视为特殊字符。空格是单引号值的一部分。

[玩转系统] 格式化 PowerShell 时间跨度

"{0:dd}d:{0:hh}h:{0:mm}m:{0:ss}s" -f $up

运算符的左侧包含替换标记。右侧包含正在处理的对象。 0 告诉 PowerShell 使用右侧的第一个对象。请注意,我使用相同的区分大小写的标记。

[玩转系统] 格式化 PowerShell 时间跨度

-f 运算符是构建您可能想要写入文件或显示为消息的字符串消息的便捷方法。

[玩转系统] 格式化 PowerShell 时间跨度

但回到我最初的需求,有了这些格式化信息,我可以运行这样的命令来获得更好的格式化输出。

$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={((Get-Date) - $_.lastbootuptime).tostring("dd\.hh\:mm")}}

$os | Select-Object CSName,LastBootUpTime,
@{Name="Uptime";Expression={"{0:dd}d:{0:hh}h:{0:mm}m:{0:ss}s" -f ((Get-Date) - $_.lastbootuptime)}}

[玩转系统] 格式化 PowerShell 时间跨度

在第一个示例中,我认为甚至秒数也无关紧要,因此我放弃了它们。

最后一个评论是,即使我的正常运行时间属性开始时是一个时间跨度,在格式化之后我已将该属性转换为字符串。我减去 LastBootUpTime 属性的原始代码仍然是一个时间跨度对象。 PowerShell 只是将其显示为字符串。如果您通过管道传输到 Sort-ObjectWhere-Object,这可能会影响您的表达式。请记住,Get-Member 是您的朋友。

我希望下次当我试图回忆如何格式化时间跨度以去除毫秒时我写了这篇文章。一如既往,欢迎提出问题和意见。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯