gpt4 book ai didi

powershell - 通过电子邮件发送附加字符串正文的最佳实践?

转载 作者:行者123 更新时间:2023-12-03 01:14:59 24 4
gpt4 key购买 nike

我有一个Powershell脚本,该脚本可以自动执行流程并通过电子邮件将发生的情况发送给报告。

Send-MailMessage -To $toAddress -From "no-reply@domain.org" -subject "Automation status" -body $bodystr -SmtpServer SERVER1 -EA Stop

因此, $bodystr本质上是整个脚本的附加字符串,用于报告发生的情况并有多行。像:
$bodystr = $bodystr + "Line found: 305`n"
$bodystr = $bodystr + "Moving line 305 to 574`n"
Send-MailMessage命令在任何功能之外的脚本底部。但是大多数其他代码具有各种不同的功能。

问题是 $bodystr在函数内部似乎不可访问,因此电子邮件缺少很多信息。

我相信我可以使用 Set-Variable或传递参数,但是参数如此之多,似乎与最佳做法相去甚远,这仅仅是为保持字符串更新而为每个函数添加新参数。

处理此问题的最佳做法是什么?

最佳答案

通常,请勿将数据写回到函数范围以外的变量中。

如果要通过从多个来源收集数据来编写电子邮件,请使用多个函数将其抽象化,每个函数都执行一项操作,并让它们返回包含相关输出的多行字符串。

在脚本末尾,收集不同的消息正文部分,并将它们连接到单个字符串,然后再发送。

在此示例中,我们有一个脚本,该脚本采用指向日志文件的路径,定义一个函数以从日志文件中提取错误,并发送包含正文中错误的电子邮件:

param(
[ValidateScript({Test-Path $_ -PathType Leaf })]
[string]$LogPath = 'C:\Path\To\File.log',
[string]$From = 'noreply@company.example',
[string]$To = @('ceo@company.example','finance@company.example'),
[string]$Subject = 'Super Important Weekly Report',
[string]$SmtpServer = $PSEmailServer,
[string]$Credential
)

# Define functions with a straight forward purpose
# e.g. Searching a logfile for errors
function Parse-Logfile {
param($LogPath)

[string[]]$LogErrors = @()

Get-Content $LogPath |ForEach-Object{
if($_ -contains $Error){
$LogErrors += $_
}
}

# Create and return a custom object has the error details as properties
New-Object psobject -Property @{
ErrorCount = $LogErrors.Count
Errors = $LogErrors
}
}

# Create a email template that's easy to maintain
# You could store this in a file and add a $TemplateFile parameter to the script ;-)
$EmailTemplate = @'
Hi there!

Found {0} errors in log file: {1}
{2}

Regards
Zeno
'@

# Use your function(s) to create and gather the details you need
$ErrorReport = Parse-Logfile -LogPath $LogPath

# If necessary, concatenate strings with -join
$ErrorString = $ErrorReport.Errors -join "`n"

# Use the format operator to the final Body string
$Body = $EmailTemplate -f $ErrorReport.ErrorCount, $LogPath, $ErrorString

# Set up a splatting table (Get-Help about_Splatting)
$MailParams = @{
To = $To
From = $From
Subject = $Subject
Body = $Body
SmtpServer = $SmtpServer
}

if($PSBoundParameters.ContainsKey('Credential')){
$MailParams['Credential'] = $Credential
}

# Send mail
Send-MailMessage @MailParams

关于powershell - 通过电子邮件发送附加字符串正文的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31884761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com