PowerShell日志判断逻辑失效,需修复多场景邮件通知功能
PowerShell脚本邮件判断逻辑修复与需求实现
问题背景
已编写PowerShell脚本实现服务器间路径复制,完成后发送附带日志的邮件,当前脚本运行正常。复制完成后生成的日志文件如下:
"\\Server1\Files\FilesMissing.log" "\\Server1\Files\FilesCopied.log" "\\Server1\Files\Output.log" "\\Server1\Files\CAS\CAS_FLDFilesCopied.log" "\\Server1\Files\CAS\CAS_FLDFilesMissing.log" "\\Server1\Files\CAS\CAS_FLD_Output.log"
需新增以下场景的判断逻辑并发送对应邮件:
- 若
FilesMissing.log和CAS_FLDFilesMissing.log均不存在,邮件内容为**“无新文件需从源端同步至目标端”** - 若
FilesMissing.log不存在,但CAS_FLDFilesMissing.log和CAS_FLDFilesCopied.log存在,邮件内容为**“文件已复制至CAS文件夹”** - 若
CAS_FLDFilesMissing.log不存在,但FilesCopied.log存在,邮件内容为**“新文件已复制至Files文件夹”**
但当前脚本中的elseif条件未生效,需解决该问题并实现上述需求。
现有脚本代码
$Username = "EmailDLxxxxx"; $Email = @("user1.gmail.com); $Password = ""; $DesiredAttachments = @( "\\Server1\Files\FilesMissing.log" "\\Server1\Files\outputLog.log" "\\Server1\Files\FilesCopied.log" "\\Server1\Files\CAS\CAS_Folder_FilesCopied.log" "\\Server1\Files\CAS\CAS_Folder_FilesMissing.log" "\\Server1\Files\CAS\CAS_Folder_OutputLog.log" ); $ActualAttachments = @(); $MissingLogFiles = @(); foreach($LogFile in $desiredAttachments){ $fileExists = Test-path $LogFile if($fileExists){ $ActualAttachments += $LogFile } else{ Write-output "File $LogFile was not present" $MissingLogFiles += $LogFile } } if($MissingLogFiles.Count -eq 0 ) { Send-MailMessage -From $Username -To $Email -Subject "Data Replication" ` -Body "Dear Team, `n This is an auto generated email. Please refer to attached logs for data replication status. `n ` FilesMissing.log -> List of missing files in Files Folder.` FilesCopied.log -> Missing files copied to Files folder.` OutputLog.log -> Number of files on Prod and Cob at path 'D:\inetpub\wwwroot\WebServer\Files\' `n ` CAS_Folder_FilesMissing .log -> List of missing files based on folder in CAS folder.` CAS_Folder_FilesCopied .log -> Missing files copied to respective folders in CAS folder.` CAS_Folder_OutputLog.log -> Number of files on Prod and Cob at path 'D:\inetpub\wwwroot\WebServer\Files\CAS\' `n`n Thanks ` -Attachments $ActualAttachments -SmtpServer "xxxxxxxxx" -Port "25" } # If FilesMissing.log and CAS_Folder_FilesMissing.log not generated/missing Elseif ( (-Not ((Test-Path $DesiredAttachments[0]) -or (Test-Path $DesiredAttachments[4])))) { write-host "1" Send-MailMessage -From $Username -To $Email -Subject "Data Replication" ` -Body "Dear Team, `n This is an auto generated email. Please refer to attached output log for data replication status. ` `n No New file(s) found on Prod server to replicate on Cob server. PROD and COB servers already in sync. `n`n Thanks ` -Attachments $ActualAttachments -SmtpServer "xxxxxxx" -Port "25" } Elseif( ((Test-Path $DesiredAttachments[0]) -and (Test-Path $DesiredAttachments[2])) -and ( -not (Test-Path $DesiredAttachments[3]) -and (Test-Path $DesiredAttachments[4])) ) { Write-host "2" Send-MailMessage -From $Username -To $Email -Subject " Data Replication" ` -Body "Dear Team, `n This is an auto generated email. Please refer to attached logs for data replication status. `n ` FilesMissing.log -> List of missing files in Files Folder.` FilesCopied.log -> Missing files copied to Files folder.` OutputLog.log -> Number of files on Prod and Cob at path 'D:\inetpub\wwwroot\WebServer\Files\' `n ` NOTE: CAS Folder contents already synched, No new files found to sync CAS Folder on COB server. ` -Attachments $ActualAttachments -SmtpServer "xxxxxxx" -Port "25" }
问题分析与解决方案
核心问题
- 文件名不匹配:需求中的
CAS_FLDFilesMissing.log、CAS_FLDFilesCopied.log在脚本里被写成CAS_Folder_FilesMissing.log、CAS_Folder_FilesCopied.log,导致路径判断完全错误。 - 条件逻辑错误:现有
elseif的逻辑组合复杂且不符合新增需求,同时因为文件名错误,即使逻辑正确也无法触发。 - 判断顺序不合理:未优先处理新增的三个场景,导致符合场景的情况被其他条件覆盖。
修正后的脚本
# 定义基础参数 $Username = "EmailDLxxxxx" $Email = @("user1.gmail.com") # 修复原脚本引号缺失问题 $SmtpServer = "xxxxxxxxx" $SmtpPort = 25 # 统一日志路径,与需求文件名完全匹配 $LogPaths = @{ FilesMissing = "\\Server1\Files\FilesMissing.log" FilesCopied = "\\Server1\Files\FilesCopied.log" Output = "\\Server1\Files\Output.log" CASFilesMissing = "\\Server1\Files\CAS\CAS_FLDFilesMissing.log" CASFilesCopied = "\\Server1\Files\CAS\CAS_FLDFilesCopied.log" CASOutput = "\\Server1\Files\CAS\CAS_FLD_Output.log" } # 收集实际存在的日志附件 $ActualAttachments = @() foreach ($logPath in $LogPaths.Values) { if (Test-Path $logPath) { $ActualAttachments += $logPath } } # 按优先级判断新增场景 # 场景1:无新文件需同步 if (-not (Test-Path $LogPaths.FilesMissing) -and -not (Test-Path $LogPaths.CASFilesMissing)) { Send-MailMessage -From $Username -To $Email -Subject "数据同步状态通知" ` -Body "Dear Team, `n`n这是自动发送的邮件。`n无新文件需从源端同步至目标端`n`n谢谢" ` -Attachments $ActualAttachments -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "触发场景1:无新文件需同步" } # 场景2:CAS文件夹完成文件复制 elseif (-not (Test-Path $LogPaths.FilesMissing) -and (Test-Path $LogPaths.CASFilesMissing) -and (Test-Path $LogPaths.CASFilesCopied)) { Send-MailMessage -From $Username -To $Email -Subject "数据同步状态通知" ` -Body "Dear Team, `n`n这是自动发送的邮件。`n文件已复制至CAS文件夹`n`n谢谢" ` -Attachments $ActualAttachments -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "触发场景2:CAS文件夹完成文件复制" } # 场景3:Files文件夹完成文件复制 elseif (-not (Test-Path $LogPaths.CASFilesMissing) -and (Test-Path $LogPaths.FilesCopied)) { Send-MailMessage -From $Username -To $Email -Subject "数据同步状态通知" ` -Body "Dear Team, `n`n这是自动发送的邮件。`n新文件已复制至Files文件夹`n`n谢谢" ` -Attachments $ActualAttachments -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "触发场景3:Files文件夹完成文件复制" } # 所有日志都存在的情况 elseif ($ActualAttachments.Count -eq $LogPaths.Count) { Send-MailMessage -From $Username -To $Email -Subject "数据同步状态通知" ` -Body "Dear Team, `n`n这是自动发送的邮件,请查看附件日志了解数据同步状态:`n`n` FilesMissing.log -> Files文件夹中缺失的文件列表`n` FilesCopied.log -> 已复制到Files文件夹的缺失文件`n` Output.log -> 源端与目标端Files路径下的文件数量统计`n` CAS_FLDFilesMissing.log -> CAS文件夹中按目录统计的缺失文件列表`n` CAS_FLDFilesCopied.log -> 已复制到CAS对应目录的缺失文件`n` CAS_FLD_Output.log -> 源端与目标端CAS路径下的文件数量统计`n`n谢谢" ` -Attachments $ActualAttachments -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "触发默认场景:所有日志存在,同步完成" } # 其他未覆盖的情况 else { Send-MailMessage -From $Username -To $Email -Subject "数据同步状态通知" ` -Body "Dear Team, `n`n这是自动发送的邮件,数据同步已完成,请查看附件日志了解详细状态。`n`n谢谢" ` -Attachments $ActualAttachments -SmtpServer $SmtpServer -Port $SmtpPort Write-Host "触发其他场景:部分日志存在,同步完成" }
关键修改点
- 统一路径命名:用哈希表存储日志路径,避免下标引用出错,同时确保文件名与需求完全一致。
- 修复语法错误:修正原脚本中
$Email变量的引号缺失问题。 - 调整判断顺序:优先处理新增的三个场景,确保逻辑优先级正确,不会被其他条件覆盖。
- 简化条件逻辑:针对每个场景的文件存在性做直接判断,避免复杂的逻辑组合导致错误。
- 优化邮件内容:根据不同场景生成对应的简洁正文,完全符合需求要求。
内容的提问来源于stack exchange,提问作者Puneet Tiwari
相关产品推荐
相关产品推荐

