PowerShell函数中使用Switch处理-UTC参数结果异常问题咨询
Switch用法的核心问题
你对PowerShell的Switch语句存在两处关键误用,是问题的根本原因:
- 判断对象和分支条件完全不匹配:你写了
Switch ($UTC),本意是想根据-UTC参数是否传入决定分支逻辑,但你所有分支的判断脚本块完全没有用到$UTC的值。PowerShell中如果Switch分支使用脚本块作为判断条件,只要脚本块返回$true就会触发执行,和Switch后紧跟的测试值无关,所以不管$UTC是$true还是$false,只要$JustDate/$NoSeperators等参数满足分支条件就会执行,完全没有起到按-UTC参数分支的作用。 - 时间逻辑硬编码:你所有分支的时间生成都硬编码了
.ToUniversalTime(),所以不管用户有没有传-UTC参数,最终生成的都是UTC时间,和你的预期逻辑不符。
你提到的“随机进入分支”的现象,是因为当多个参数同时为真时,Switch会按从上到下的顺序匹配第一个满足条件的分支,如果你不同次运行时的参数组合有细微差异,就会出现看起来随机的匹配结果。
修复方案
不需要换回If语句,调整Switch结构即可实现你的需求:
首先统一判断使用UTC时间还是本地时间,再根据格式参数生成对应的时间字符串,避免重复代码:
# 先确定要使用的时间对象 $targetDate = if ($UTC) { Get-Date -Utc } else { Get-Date } # 再根据格式参数生成时间字符串,用$true作为测试值匹配符合条件的分支 Switch ($true) { { $JustDate -and !$NoSeperators } { $timeStr = $targetDate.ToString("yyyy_MM_dd-") break } { $NoSeconds -and !$NoSeperators } { $timeStr = $targetDate.ToString("yyyy_MM_ddThhmm-") break } { !$NoSeperators } { $timeStr = $targetDate.ToString("yyyy_MM_ddThhmmss-") break } { $JustDate -and $NoSeperators } { $timeStr = $targetDate.ToString("yyyyMMdd") break } { $NoSeconds -and $NoSeperators } { $timeStr = $targetDate.ToString("yyyyMMddThhmm") break } { $NoSeperators } { $timeStr = $targetDate.ToString("yyyyMMddThhmmss") break } } $FullPath = Join-AnyPath $DirectoryName ($timeStr + $ReportNameExt)
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

