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
相关产品推荐
相关产品推荐

