这可能是一个简单的错误,我的脚本重新启动服务器并通过电子邮件发送预启动时间和启动后时间。现在重新启动工作和电子邮件工作但电子邮件中的时间是空白的,现在如果我键入write-host $ sgr11我得到的时间就好了。然而,在某个地方,它没有进入我的电子邮件正文...任何信息都会很棒,我知道我的代码非常混乱,根本没有效率。我只做了大约一个星期,任何有建设性的事情,你想指出帮助会很棒。
由于 科迪
# Store all the start up variables so you can clean up when the script finishes.
if ($startupvariables) { try {Remove-Variable -Name startupvariables -Scope Global -ErrorAction SilentlyContinue } catch { } }
New-Variable -force -name startupVariables -value ( Get-Variable | ForEach-Object { $_.Name } )
$global:date = Get-Date
$global:server = 'SGSQL1', 'SGSQL2', 'appv1', 'appv2', 'sltappv4'
$global:emailSmtpServer = "exmbx6"
$global:emailFrom = "gordonc@"
$global:emailTo = "retinaAlert@"
$global:emailSubject = "Result: Reboot report for $server $date"
$global:emailSubjectF = "Stuff Failed"
$global:emailBody = @"
<p><strong>Todays Date</strong>:$date</p>
<p> </p>
<p>Server: SGSQL1</p>
<p> <strong>Pre Boot Time:</strong>$sgr11</p>
<p> <strong>Post Boot Time:</strong>$sgr12</p>
<p>________________________________</p>
<p>Server: SGSQL2</p>
<p><strong>Pre Boot Time:</strong>$sgr21</p>
<p><strong>Post Boot Time:</strong>$sgr22</p>
<p>________________________________</p>
<p>Server: Appv1</p>
<p><strong>Pre Boot Time:</strong>$apr11</p>
<p><strong>Post Boot Time:</strong>$apr12</p>
<p>________________________________</p>
<p>Server: Appv2</p>
<p><strong>Pre Boot Time:</strong>$apr21</p>
<p><strong>Post Boot Time:</strong>$apr22</p>
<p>________________________________</p>
<p>Server: SltAppv4</p>
<p><strong>Pre Boot Time:</strong>$spr11</p>
<p><strong>Post Boot Time:</strong>$spr12</p>
<p> </p>
<p>Please close the Event Notifcation in FootPrints</p>
"@
$global:emailBodyF = @"
<p>THINGS FAILD</p>
"@
Function global:Preuptime{
$global:sgs11 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sgsql1"
$global:sgr11 = $sgs11.ConvertToDateTime($sgs11.LastBootUpTime) | Out-String
#
$global:sgs21 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sgsql2"
$global:sgr21 = $sgs21.ConvertToDateTime($sgs21.LastBootUpTime) | Out-String
#
$global:app11 = Get-WmiObject -Class Win32_OperatingSystem -Computer "appv1"
$global:apr11 = $app11.ConvertToDateTime($app11.LastBootUpTime) | Out-String
#
$global:app21 = Get-WmiObject -Class Win32_OperatingSystem -Computer "appv2"
$global:apr21 = $app21.ConvertToDateTime($app21.LastBootUpTime) | Out-String
#
$global:spp11 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sltappv4"
$global:spr11 = $spp11.ConvertToDateTime($spp11.LastBootUpTime) | Out-String
}
Function global:FailedEmail
{
Send-MailMessage -To $emailTo -From $emailFrom -Subject $emailSubjectF -Body $emailBodyF -SmtpServer $emailSmtpServer -BodyAsHtml
}
Function global:WorkedEmail {
Send-MailMessage -To $emailTo -From $emailFrom -Subject $emailSubject -Body $emailBody -SmtpServer $emailSmtpServer -BodyAsHtml
}
Function global:ServerReboot
{
foreach($servers in $server){
ping -n 2 $servers >$null
if($lastexitcode -eq 0){
Restart-Computer -Wait -Force -For Wmi $servers
} else {
FailedEmail
}
}
}
Function global:Postuptime{
$global:sgs12 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sgsql1"
$global:sgr12 = $sgs12.ConvertToDateTime($sgs12.LastBootUpTime) | Out-String
#
$global:sgs22 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sgsql2"
$global:sgr22 = $sgs22.ConvertToDateTime($sgs22.LastBootUpTime) | Out-String
#
$global:app12 = Get-WmiObject -Class Win32_OperatingSystem -Computer "appv1"
$global:apr12 = $app12.ConvertToDateTime($app12.LastBootUpTime) | Out-String
#
$global:app22 = Get-WmiObject -Class Win32_OperatingSystem -Computer "appv2"
$global:apr22 = $app22.ConvertToDateTime($app22.LastBootUpTime) | Out-String
#
$global:spp12 = Get-WmiObject -Class Win32_OperatingSystem -Computer "sltappv4"
$global:spr12 = $spp12.ConvertToDateTime($spp12.LastBootUpTime) | Out-String
}
<#
preuptime
serverreboot
postuptime
workedemail
#>
<#
Function Clean-Memory {
Get-Variable |
Where-Object { $startupVariables -notcontains $_.Name } |
ForEach-Object {
try { Remove-Variable -Name "$($_.Name)" -Force -Scope "global" -ErrorAction SilentlyContinue -WarningAction SilentlyContinue}
catch { }
}
}
#>
结果电子邮件就是这样的。我注意到的一件事是,每次我在ISE中运行脚本时,每次都需要更长的时间,不确定这是否相关。
Todays Date:07/10/2014 19:03:57
Server: SGSQL1
Pre Boot Time:
Post Boot Time:
________________________________
Server: SGSQL2
Pre Boot Time:
Post Boot Time:
________________________________
Server: Appv1
Pre Boot Time:
Post Boot Time:
________________________________
Server: Appv2
Pre Boot Time:
Post Boot Time:
________________________________
Server: SltAppv4
Pre Boot Time:
Post Boot Time:
答案 0 :(得分:0)
基本上,您的问题是您在创建字符串中的变量之前创建了电子邮件正文字符串,因此它们会扩展为null。在不重新安排代码的情况下解决这个问题的简单方法是将here-string放入脚本块,然后在创建变量后调用脚本块并准备好使用字符串:
$start = $null
$end = $null
$body_string = @"
Start time is $start
End time is $end
"@
$body_scriptblock = {@"
Start time is $start
End time is $end
"@}
$start = get-date
start-sleep -Seconds 2
$end = get-date
$body_string
&$body_scriptblock
Start time is
End time is
Start time is 07/10/2014 20:27:00
End time is 07/10/2014 20:27:02