You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell数据类型检测函数无法正确识别时间戳问题排查

PowerShell日期解析函数问题修复

问题场景

用PowerShell脚本辅助数据库更新操作,需先查询数据本地解析后构建更新语句。编写的getDataType函数用于PowerShell与SQL的类型转换,但传入时间戳字符串'5/10/2023'时,函数返回'string'而非预期的'timestamp',全局变量$setDate也未被赋值。

错误原因

  1. TryParseExact参数缺失:调用[DateTime]::TryParseExact时未指定文化信息和日期样式,默认使用当前系统文化,可能与目标日期格式不兼容。
  2. 函数调用语法错误:PowerShell中调用函数应使用getDataType $myDate,而非C#风格的getDataType($myDate),后者会将参数作为数组传递,导致函数接收的$inputData是数组而非字符串。
  3. 数字判断逻辑缺陷:直接用[int]$inputData强制转换,转换失败会抛出异常,且无法正确处理非整数数字(如小数)。

修复后的代码

$myDate = '5/10/2023'

function getDataType {
    param($inputData)
    
    # 处理空值
    if ($null -eq $inputData -or $inputData -eq '') {
        return 'null'
    }

    # 尝试解析为时间戳
    $dateFormats = @('M/d/yyyy','M/dd/yyyy','MM/d/yyyy','MM/dd/yyyy','MM-dd-yyyy HH:mm:ss','MM-dd-yyyy HH:mm','yyyy-MM-dd HH.mm.ss')
    $culture = [System.Globalization.CultureInfo]::InvariantCulture
    $styles = [System.Globalization.DateTimeStyles]::None

    foreach ($format in $dateFormats) {
        if ([DateTime]::TryParseExact($inputData, $format, $culture, $styles, [ref]$null)) {
            $global:setDate = [datetime]::ParseExact($inputData, $format, $culture).ToString('yyyy-MM-dd HH:mm:ss')
            return 'timestamp'
        }
    }

    # 尝试解析为数字
    if ([double]::TryParse($inputData, [ref]$null)) {
        return 'number'
    }

    # 默认返回字符串类型
    return 'string'
}

# 修正函数调用方式
getDataType $myDate

write-host "the date is $setDate"

验证结果

  • 调用getDataType $myDate返回timestamp,符合预期。
  • $setDate输出2023-05-10 00:00:00,符合预期。

内容的提问来源于stack exchange,提问作者Randy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:17:19