gpt4 book ai didi

powershell - 如果 PowerShell 脚本出现任何错误,请发送电子邮件并终止该脚本

转载 作者:行者123 更新时间:2023-12-02 12:39:04 25 4
gpt4 key购买 nike

我最近一直在思考的事情,我希望得到 Stack Overflow 的好心人的一些意见。

我按照不同的计划运行相当大量的 PowerShell 脚本(使用任务计划程序)。这些脚本通常会收集数据并将其存储在 SQL 表中。我想说我目前正在运行 40-50 个脚本左右,甚至更多。

我最近认真考虑的一件事是最好的方法:

  1. 确保如果发生任何错误,脚本会退出而不进行进一步处理。
  2. 脚本还应该在失败时向我发送一封电子邮件,其中包含异常详细信息,向我展示它已经完成了多少。
  3. 记录脚本/进度,以便我可以查看任何错误并尝试在脚本中更好地处理它们。

这将是一项相当大的工作要做,所以我想从一开始就采用正确的方法。

我认为实现此类目标的唯一方法是执行以下操作:

将 $ErrorActionPreference 设置为“停止”

这应该会导致任何异常触发 Try/Catch block 。

在 Try/Catch/Finally block 中运行整个脚本。

最后的 block 当然是可选的。像这样的事情:

$ErrorActionPreference = "Stop"

Try
{
$Content = gc "C:\Temp\NonExistentFile.txt"
foreach ($Line in $Content)
{
Write-Host $Line
}
}
Catch
{
Write-Host $_ -ForegroundColor "Red" -BackgroundColor "Black"
break
}

将“转录”数据记录到 HTML 中,并在失败时通过电子邮件发送内容。

我尝试了几种日志记录方法,对我来说最重要的事情之一是我想要的是:

  1. 通过提供文本和日志文件位置即可轻松登录。
  2. 包括日志文件每行开头的日期/时间。

我开始将文本写入 .txt 文件,但这需要做一些工作。

Start-Transcript 没问题,但没有在每行中包含日期/时间。

我在使用 Start-Transcript 的自定义函数方面取得了一些成功,并将我发送到其中的任何文本写入 Write-Host,并在每行的开头加上日期/时间。

但最终我认为我需要做的是登录到 .html 文档,然后在发生错误时通过电子邮件发送该内容。像这样的例子:

Function Send-ErrorEmail
{
Write-Host "Would Send Email Here" -ForegroundColor "Magenta"
}

Function Write-Html
{
[CmdletBinding()]
param
(
[Parameter(ValueFromPipeline=$True)]$Text,
$HTMLTag
)

[string]$CurrentDateTime = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss - ")

switch ($HTMLTag)
{
"h1" {$ReturnText = ("<h1>" + $Text + "</h1>")}
"h2" {$ReturnText = ("<h2>" + $Text + "</h2>")}
default {$ReturnText = ("<p>" + $CurrentDateTime + $Text + "</p>")}
}

Write-Host -ForegroundColor "Yellow" ($CurrentDateTime + $Text)
return $ReturnText
}

$ErrorActionPreference = "Stop"

Try
{
#Stores the HTML File
$LogfilePath = "C:\Temp\LogFile.html"

#Begin HTML
$HTML = @()
$HTML += "<html><head></head><body>"
$HTML += "Begin Script" | Write-Html

#Loop through Computers
$Computers = "LocalHost", "DoesNotExist", "127.0.0.1"
foreach ($Computer in $Computers)
{
#Get Services
$HTML += "Computer: $Computer" | Write-Html -HTMLTag "h1"
$Services = Get-Service -Computer $Computer
$HTML += $Services | ConvertTo-Html -Fragment
}

#Complete HTML
$HTML += "Script End" | Write-Html
$HTML += "</body></html>"
$HTML | Out-File $LogfilePath
}
Catch
{
#Add Exception to HTML
$HTML += $_ | Out-String | Write-Html

#Complete HTML
$HTML += "</body></html>"
$HTML | Out-File $LogfilePath

#Send EMail
Send-ErrorEmail

#Exit Script
exit
}

有什么想法吗?您认为我可以做出哪些改进?显然,没有 CSS 格式的 HTML 文档很难看,并且发送邮件功能没有执行任何操作,但这似乎是执行我想要的操作的最简单方法。

我当然可以在我的所有脚本中点取任何函数,以便于更改通知电子邮件地址或类似地址。

最佳答案

对于全局错误处理,我更喜欢使用 trap 语句。

function ErrorHandler($error) 
{
... write out error info
... send email message with error info
... etc
}

trap { ErrorHandler $_; break }

... rest of script code

如果您想避免任何错误,那么可以将 $ErrorActionPreference 设置为 Stop

关于powershell - 如果 PowerShell 脚本出现任何错误,请发送电子邮件并终止该脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14246512/

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