首先,我现在正在学习 PowerShell。因此,我正在监控公司所有服务器上的驱动器空间,我想自动化该过程。这就是我得到的
$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Size, FreeSpace
Write-Host ("{0}GB total" -f [math]::truncate($disk.Size / 1GB))
Write-Host ("{0}GB free on C: OS" -f [math]::truncate($disk.FreeSpace / 1GB))
我希望它每周早上 9 点运行(如果可能的话),然后收到一封包含 .ps1 输出的电子邮件。
有人能给我指出正确的方向吗?
答案1
此脚本已准备好运行,只需进行少量更改。您需要确保在名为 的文件中有一个服务器列表,servers.txt
该文件在代码顶部进行了说明。该列表应如下所示:
CompanyDC
CompanyFileServer
CompanyExchange
CompanyRandomServer
由于 wmi 调用,此脚本还必须以域管理员身份运行。第$cred
1 行上的变量将建立该权限,并在每次运行脚本时通过 UAC 窗口询问密码。
该#SMTP Deets
部分已使用免费中继服务器。您所要做的就是填写发件人地址,然后输入收件人地址作为要将报告发送到的电子邮件。
我编写了表格,这样当电子邮件发送时,服务器也会根据剩余的磁盘空间量用绿色/黄色/红色进行颜色编码。阈值为:绿色 > 剩余 20% || 橙色 11%-20% || 红色 0%-10%。
以下是电子邮件的示例:
编辑$cred
,$ServerName
目录(参见上面的示例 txt 文件),$smtpFrom
然后$smtpTo
您就可以开始了。
$cred = Get-Credential -Credential 'domain\user'
$ServerName = Get-Content "C:\temp\servers.txt"
$ConvertToGB = (1024 * 1024 * 1024)
$enter1 = "`r"
$enter2 = "`r`n"
# Smtp deets
$smtpServer = "relay.appriver.com"
$smtpPort = "2525"
$smtpFrom = "[email protected]"
$smtpTo = "[email protected]"
$messageSubject = "Daily Server Report"
# Set up an SmtpClient
$smtpClient = New-Object Net.Mail.SmtpClient
$smtpClient.Host = $smtpServer
$smtpClient.Port = $smtpPort
# Create the MailMessage
$mailMessage = New-Object Net.Mail.MailMessage
$mailMessage.From = $smtpFrom
$mailMessage.To.Add($smtpTo)
$mailMessage.Subject = $messageSubject
$mailMessage.IsBodyHtml = $true
# style
$htmlReport += "<style>"
$htmlReport += "BODY{background-color:white;}"
$htmlReport += "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$htmlReport += "TH{border-width: 1px;padding: 0px;border-style: solid;border-color: black;}"
$htmlReport += "TD{border-width: 1px;padding: 0px;border-style: solid;border-color: black;}"
$htmlReport += "</style>"
# table
$htmlReport += "<table>"
$htmlReport += "`n"
$htmlReport += "<tr>"
$htmlReport += "<th>ServerName</th>"
$htmlReport += "<th>Total Space</th>"
$htmlReport += "<th>Free Space</th>"
$htmlReport += "<th>Percent Free</th>"
$htmlReport += "</tr>"
foreach($Server in $ServerName)
{
$disk = Get-WmiObject -Credential $cred Win32_LogicalDisk -ComputerName $Server -Filter "DeviceID='C:'" | Select-Object Size,FreeSpace
$htmlReport += "<tr>"
$htmlReport += "<td>$($Server)</td>"
$htmlReport += "<td>$([Math]::Truncate($disk.Size / $ConvertToGB)) GB </td>"
$htmlReport += "<td>$([Math]::Truncate($disk.FreeSpace / $ConvertToGB)) GB </td>"
if([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100) -le 10)
{
$htmlReport += "<td><font color=red> $([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100)) % </font></td>"
}
if([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100) -gt 10 -and [Math]::Truncate(($disk.FreeSpace / $disk.size) * 100) -le 20)
{
$htmlReport += "<td><font color=orange> $([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100)) % </font></td>"
}
if([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100) -gt 20)
{
$htmlReport += "<td><font color=green> $([Math]::Truncate(($disk.FreeSpace / $disk.size) * 100)) % </font></td>"
}
$htmlReport += "</tr>"
}
$htmlReport += "</table>"
# Now create an AlternateView from the HTML contents
$messageBody = [Net.Mail.AlternateView]::CreateAlternateViewFromString($htmlReport, 'text/html')
# Add the HTML view to the MailMessage
$mailMessage.AlternateViews.Add($messageBody)
# And finally send the message
$smtpClient.Send($mailMessage)
pause
编辑 - 然后在一台始终在早上 9 点开启的可靠机器上使用任务计划程序来设置此 ps1 运行。“任务计划程序 > 创建基本任务 > 命名任务 > 选择每日作为开始 > 操作:每 1 天重复一次 @ 您设置的 xx 时间 > 启动程序 > 浏览您的 ps1 > 完成。