PowerShell数据类型检测函数无法正确识别时间戳问题排查
PowerShell日期解析函数问题修复
问题场景
用PowerShell脚本辅助数据库更新操作,需先查询数据本地解析后构建更新语句。编写的getDataType函数用于PowerShell与SQL的类型转换,但传入时间戳字符串'5/10/2023'时,函数返回'string'而非预期的'timestamp',全局变量$setDate也未被赋值。
错误原因
TryParseExact参数缺失:调用[DateTime]::TryParseExact时未指定文化信息和日期样式,默认使用当前系统文化,可能与目标日期格式不兼容。- 函数调用语法错误:PowerShell中调用函数应使用
getDataType $myDate,而非C#风格的getDataType($myDate),后者会将参数作为数组传递,导致函数接收的$inputData是数组而非字符串。 - 数字判断逻辑缺陷:直接用
[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
相关产品推荐
相关产品推荐

