You need to enable JavaScript to run this app. PowerShell函数中使用Switch处理-UTC参数结果异常问题咨询
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell函数中使用Switch处理-UTC参数结果异常问题咨询

Switch用法的核心问题

你对PowerShell的Switch语句存在两处关键误用,是问题的根本原因:

  1. 判断对象和分支条件完全不匹配:你写了Switch ($UTC),本意是想根据-UTC参数是否传入决定分支逻辑,但你所有分支的判断脚本块完全没有用到$UTC的值。PowerShell中如果Switch分支使用脚本块作为判断条件,只要脚本块返回$true就会触发执行,和Switch后紧跟的测试值无关,所以不管$UTC是$true还是$false,只要$JustDate/$NoSeperators等参数满足分支条件就会执行,完全没有起到按-UTC参数分支的作用。
  2. 时间逻辑硬编码:你所有分支的时间生成都硬编码了.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 22:06:01