DevCN
菜单
全部文章快讯开发科技深度热点

PowerShell 函数:校验时长并保持输出流纯净

调用 .NET TryParse 解析分钟数,只返回整数或空值,避免诊断文字混入成功输出流而污染后续统计。


本节目标

调用 .NET TryParse 解析分钟数,只返回整数或空值,避免诊断文字混入成功输出流而污染后续统计。

环境与运行方法

使用 PowerShell 7,保存为 lesson.ps1,执行 pwsh -NoProfile -File lesson.ps1。不修改系统配置,也不调用 Windows 专属管理接口。

核心思路

PowerShell 函数写入成功输出流的对象都会成为返回内容,随手输出一行日志也可能改变调用者得到的数据。本例把展示放在函数外。

完整示例

function Convert-Minutes {
    param([string]$Text)
    $value = 0
    if (-not [int]::TryParse($Text, [ref]$value) -or $value -lt 0 -or $value -gt 1440) {
        return $null
    }
    return $value
}
foreach ($text in @('30', '0', 'bad', '1441')) {
    $value = Convert-Minutes -Text $text
    if ($null -eq $value) { Write-Output 'invalid' }
    else { Write-Output ('ok={0}' -f $value) }
}

预期输出

ok=30
ok=0
invalid
invalid

逐步理解

[ref] 让解析结果写回变量,布尔返回值才表示解析成功。失败不能只看 value 是否零,因为合法输入也可能为零。空值放在比较左边,避免某些集合比较情形带来歧义。

若函数需要诊断,应使用适合的诊断流,不要随意 Write-Output。否则调用者可能收到混合文本和数值的数组。参数声明还可能触发类型转换,入口契约应与调用方约定一致。

常见问题与边界

  • 不能用值的真假代替空值检查。
  • 成功输出流中的日志也会进入结果。
  • 类型转换与业务范围检查各有作用。

动手练习

增加 "1440"、"-1",再尝试在函数中输出一行调试文字。

参考答案

新增正常结果为 1440 与失败。调试文字进入成功流后可能让返回值变成多个对象,应移除或改用诊断方式,恢复单一结果契约。

下载推广海报

文章推广海报

《PowerShell 函数:校验时长并保持输出流纯净》完整推广海报
DISCUSSION

文章回复

0 条公开回复
未登录回复需要审核后公开
还没有回复,欢迎参与讨论。