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

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"
}

问题分析与解决方案

核心问题

  1. 文件名不匹配:需求中的CAS_FLDFilesMissing.log、CAS_FLDFilesCopied.log在脚本里被写成CAS_Folder_FilesMissing.log、CAS_Folder_FilesCopied.log,导致路径判断完全错误。
  2. 条件逻辑错误:现有elseif的逻辑组合复杂且不符合新增需求,同时因为文件名错误,即使逻辑正确也无法触发。
  3. 判断顺序不合理:未优先处理新增的三个场景,导致符合场景的情况被其他条件覆盖。

修正后的脚本

# 定义基础参数
$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 "触发其他场景:部分日志存在,同步完成"
}

关键修改点

  1. 统一路径命名:用哈希表存储日志路径,避免下标引用出错,同时确保文件名与需求完全一致。
  2. 修复语法错误:修正原脚本中$Email变量的引号缺失问题。
  3. 调整判断顺序:优先处理新增的三个场景,确保逻辑优先级正确,不会被其他条件覆盖。
  4. 简化条件逻辑:针对每个场景的文件存在性做直接判断,避免复杂的逻辑组合导致错误。
  5. 优化邮件内容:根据不同场景生成对应的简洁正文,完全符合需求要求。

内容的提问来源于stack exchange,提问作者Puneet Tiwari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:35:56