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

如何在Azure Data Factory中用PowerShell脚本自动化任务、捕获错误并发送邮件?

Azure Data Factory 管道自动化+失败邮件通知(PowerShell实现,无需Logic App)

核心思路

通过PowerShell调用Azure Data Factory的Az模块,实现管道触发、运行状态轮询、失败错误捕获,最终用PowerShell原生邮件命令或Azure SendGrid发送通知,全程不依赖Logic App或自定义活动。


1. 前置准备

  • 安装并导入Az.DataFactory模块:
    Install-Module -Name Az.DataFactory -Force -Scope CurrentUser
    Import-Module Az.DataFactory
    
  • 确保执行脚本的账号拥有ADF的Data Factory Contributor权限,同时具备邮件发送权限(SMTP账号或SendGrid API密钥)

2. 完整PowerShell脚本实现

# -------------------------- 配置参数 --------------------------
$resourceGroupName = "你的资源组名称"
$dataFactoryName = "你的ADF实例名称"
$pipelineName = "目标管道名称"

# 邮件配置(SMTP示例,可替换为SendGrid API)
$smtpServer = "smtp.office365.com" # 示例:Office 365 SMTP服务器
$smtpPort = 587
$senderEmail = "alert@yourdomain.com"
$recipientEmails = @("user1@yourdomain.com", "user2@yourdomain.com")
$smtpCredential = Get-Credential -Message "输入SMTP账号密码"

# 轮询配置(根据管道时长调整)
$maxPollTimes = 60  # 最多轮询60次
$pollInterval = 30   # 每次间隔30秒
# -------------------------------------------------------------

# 1. 触发管道运行
try {
    $pipelineRun = Invoke-AzDataFactoryV2Pipeline -ResourceGroupName $resourceGroupName `
        -DataFactoryName $dataFactoryName `
        -PipelineName $pipelineName
    $runId = $pipelineRun.RunId
    Write-Host "管道触发成功,运行ID: $runId"
}
catch {
    # 触发失败时发送邮件
    $errorSubject = "ADF管道触发失败 | $pipelineName"
    $errorBody = "触发管道时发生错误:`n`n错误详情:$_"
    Send-MailMessage -From $senderEmail -To $recipientEmails `
        -Subject $errorSubject -Body $errorBody `
        -SmtpServer $smtpServer -Port $smtpPort `
        -UseSsl -Credential $smtpCredential
    Write-Error "管道触发失败,已发送通知邮件"
    exit 1
}

# 2. 轮询管道运行状态
$currentStatus = "InProgress"
for ($i=1; $i -le $maxPollTimes; $i++) {
    $runDetails = Get-AzDataFactoryV2PipelineRun -ResourceGroupName $resourceGroupName `
        -DataFactoryName $dataFactoryName `
        -PipelineRunId $runId
    $currentStatus = $runDetails.Status
    Write-Host "第$i次轮询,当前状态: $currentStatus"

    if ($currentStatus -ne "InProgress") { break }
    Start-Sleep -Seconds $pollInterval
}

# 3. 处理运行结果
if ($currentStatus -eq "Failed") {
    # 获取所有失败活动的详细错误信息
    $failedActivities = Get-AzDataFactoryV2ActivityRun -ResourceGroupName $resourceGroupName `
        -DataFactoryName $dataFactoryName `
        -PipelineRunId $runId `
        -Status "Failed"
    
    # 构建邮件内容
    $errorSubject = "ADF管道执行失败 | $pipelineName (运行ID: $runId)"
    $errorBody = @"
管道执行失败,详细信息如下:

管道名称:$pipelineName
运行ID:$runId
失败时间:$($runDetails.LastUpdated)

--- 失败活动列表 ---
"@
    foreach ($activity in $failedActivities) {
        $errorBody += @"

活动名称:$($activity.ActivityName)
活动类型:$($activity.ActivityType)
错误信息:$($activity.Error.Message)
"@
        if ($activity.Error.Details) {
            $errorBody += "错误详情:`n$($activity.Error.Details | Out-String)"
        }
    }

    # 发送失败通知邮件
    try {
        Send-MailMessage -From $senderEmail -To $recipientEmails `
            -Subject $errorSubject -Body $errorBody `
            -SmtpServer $smtpServer -Port $smtpPort `
            -UseSsl -Credential $smtpCredential
        Write-Host "失败通知邮件已发送"
    }
    catch {
        Write-Error "发送通知邮件失败:$_"
    }
}
elseif ($currentStatus -eq "Succeeded") {
    Write-Host "管道执行成功"
}
else {
    Write-Host "管道运行状态异常:$currentStatus"
}

3. 关键注意事项

  • 权限验证:执行脚本的账号需能读取ADF运行日志,SMTP账号需允许客户端发件(比如Office 365需开启“允许不安全应用”或使用应用密码)
  • 轮询参数调整:maxPollTimes和pollInterval要匹配管道的预期运行时长,避免过早终止轮询
  • 邮件方式替换:如果不想用SMTP,可以改用Azure SendGrid API,替换Send-MailMessage为Invoke-RestMethod调用SendGrid的邮件发送接口
  • 自动化部署:可将脚本部署到Azure Automation Runbook或本地Windows任务计划,实现定期自动触发

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 21:55:14