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

PowerShell ForEach-Object内嵌Switch语句无法正常运行排查

问题原因
  • Switch -Wildcard语法写错了:通配符模式下switch的分支条件直接写匹配规则就行,你现在把$Inputstring -like "xxx"整个布尔判断当分支条件,switch会拿输入的字符串和布尔值$true/$false做匹配,根本进不到你写的计算逻辑里。
  • 没有累加逻辑:你只写了给单次计算值$ADDhrs赋值的代码,既没初始化总时长计数器,也没在每次匹配到服务条目后把单次算出的时长加到总计数里,最后拿不到累计结果。
  • 未做类型强转:从文本行里拆分出的购买数量默认是字符串,直接做乘法在部分PowerShell版本里会触发类型错误。
  • 如果$global:EMLpath没有提前赋值,Select-String会直接找不到目标文件,返回空结果。
修正后可直接运行的代码
# 运行前请先给全局路径赋值,示例:$global:EMLpath = "C:\你的eml文件存放目录"
$totalHours = 0 # 初始化总时长计数器

# 检索所有eml文件中的订单标记行
$orderMatches = Select-String -Path "$global:EMLpath\*.eml" -Pattern "[ORDER #" -SimpleMatch -CaseSensitive -Context 0,10

foreach ($match in $orderMatches) {
    # 遍历每个订单块后续10行内容
    $match.Context.PostContext | ForEach-Object {
        $currentLine = $_.Trim() # 清除行首尾空格,避免缩进导致匹配失败
        switch -Wildcard ($currentLine) {
            "Hourly*" {
                $count = [int](-split $currentLine)[4]
                $totalHours += 1 * $count
            }
            "Weekly*" {
                $count = [int](-split $currentLine)[4]
                $totalHours += 168 * $count
            }
            "Monthly*" {
                $count = [int](-split $currentLine)[4]
                $totalHours += 720 * $count
            }
            "Yearly*" {
                $count = [int](-split $currentLine)[4]
                $totalHours += 8640 * $count
            }
        }
    }
}

# 输出最终统计结果(单位:小时)
Write-Host "累计购买服务总时长:$totalHours 小时"
效果验证

针对你给出的示例订单内容:

  • 按月购买1份,贡献时长720 * 1 = 720小时
  • 按周购买2份,贡献时长168 * 2 = 336小时
  • 累计总时长为1056小时,运行修正后脚本可正确输出该结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 04:45:57