PowerShell技术问题:追加票据创建日期到数组时日期重复
PowerShell中每个工单对应日期重复多次的问题原因及解决方法
你遇到的问题是在生成工单HTML行时,每个工单对应的日期会重复显示多次,比如:
INC0001 10/12/20 10/12/20 10/12/20 10/12/20 INC0002 10/12/20 10/12/20 10/12/20 10/12/20
而期望每个工单只显示自己的创建日期,我们先拆解问题的核心原因。
问题原因
你当前的代码逻辑里,提前把当前团队的所有工单的创建日期一次性取出来存到了$date变量中:
$date = $results |Where-Object TeamName -eq $team.TeamName |Select -ExpandProperty createdDate
这个$date实际上是一个数组(当该团队有多个工单时)。当你在字符串中直接使用$date时,PowerShell会自动将数组的所有元素用空格拼接成一个字符串,所以每个工单的<td>里就会显示该团队所有工单的日期,重复次数等于该团队的工单数量(你感觉和团队总数相关应该是巧合,比如刚好每个团队的工单数量等于团队总数)。
简单说:你没有给每个工单匹配对应的单个日期,而是把所有日期一股脑塞给了每个工单。
解决方案
我们需要调整逻辑,遍历每个工单记录时同时获取对应的TicketID和createdDate,而不是分开取ID列表和日期列表。
基础优化代码
$teamConfig = @( [pscustomobject]@{ TeamName = 'Team1'; TeamEmail = 'team1@domain.tld' } [pscustomobject]@{ TeamName = 'Team2'; TeamEmail = 'team2@domain.tld' } ) $query = "select * from INCAutomation" $results = Invoke-Sqlcmd -query $query -ServerInstance 'localhost' -Database 'AyushTest' $teamTickets = foreach($team in $teamConfig) { $ticketIdArray = @() # 直接遍历当前团队的每一条工单记录,同时拿到ID和对应日期 foreach ($ticket in $results | Where-Object TeamName -eq $team.TeamName) { $thisId = " <tr> <td>$($ticket.TicketID)</td> <td>$($ticket.createdDate)</td> </tr> " $ticketIdArray += $thisId } $team | Select TeamName,TeamEmail,@{Name='HTML';Expression={$ticketIdArray}} } $teamTickets.HTML
高效写法(推荐)
如果你工单数量较多,不推荐用数组累加(+=)的方式,因为每次累加都会创建新数组,效率较低。可以直接用ForEach-Object生成所有HTML行,再拼接成字符串:
$teamConfig = @( [pscustomobject]@{ TeamName = 'Team1'; TeamEmail = 'team1@domain.tld' } [pscustomobject]@{ TeamName = 'Team2'; TeamEmail = 'team2@domain.tld' } ) $query = "select * from INCAutomation" $results = Invoke-Sqlcmd -query $query -ServerInstance 'localhost' -Database 'AyushTest' $teamTickets = foreach($team in $teamConfig) { # 直接生成所有HTML行并拼接成单个字符串 $htmlContent = $results | Where-Object TeamName -eq $team.TeamName | ForEach-Object { " <tr> <td>$($_.TicketID)</td> <td>$($_.createdDate)</td> </tr> " } | Join-String -Separator '' $team | Select TeamName,TeamEmail,@{Name='HTML';Expression={$htmlContent}} } $teamTickets.HTML
这样修改后,每个工单就只会显示自己对应的创建日期,完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者yush
相关产品推荐
相关产品推荐

