Powershell脚本-仅在驱动器空间低于MinThreshold时发送电子邮件

时间:2019-11-26 17:53:22

标签: windows powershell windows-10

我正在使用Windows 10 Enterprise 1709和PowerShell版本5.0。我在网上找到下面的PowerShell脚本。它可以工作,但是我不了解代码行在做什么,因此我可以决定如何根据需要进行编辑。此外,即使驱动器不低于最低阈值,它也会发送电子邮件。我想了解这段代码,并将其修复为仅在达到最低阈值以下时才发送电子邮件警报。 $freeSpaceGB = [Math]::Round([float]$disk.FreeSpace / 1073741824);和这一行$computer = $computer.toupper();

完整代码如下:

$minGbThreshold = 50GB

$computers = $env:COMPUTERNAME
$smtpAddress = "smtp.our-firm.com"
$toAddress = "anyone@anywhere.com"
$fromAddress = "desktop-admin@anywhere.com"

foreach($computer in $computers)
{    
    $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3";
    $computer = $computer.toupper();
    $deviceID = $disk.DeviceID;
    foreach($disk in $disks)
    {
        $freeSpaceGB = [Math]::Round([float]$disk.FreeSpace / 1073741824);
        if($freeSpaceGB -lt $minGbThreshold)
        {
            $smtp = New-Object Net.Mail.SmtpClient($smtpAddress)
            $msg = New-Object Net.Mail.MailMessage
            $msg.To.Add($toAddress)
            $msg.From = $fromAddress
            $msg.Subject = “Diskspace below threshold ” + $computer + "\" + $disk.DeviceId
            $msg.Body = $computer + "\" + $disk.DeviceId + " " + $freeSpaceGB + "GB Remaining";
            $smtp.Send($msg)
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我终于有了一个工作脚本。希望这对其他人有帮助。这就是我一直在寻找的答案。

$minGbThreshold = 29;
$computers = $env:COMPUTERNAME;
$smtpAddress = "smtp.yourdomain.com";
$toAddress = "anyemail@gmail.com";
$fromAddress = "anyotheremail@gmail.com";
foreach($computer in $computers)
{    
    $disks = Get-WmiObject -ComputerName $computer -Class Win32_LogicalDisk -Filter "DriveType = 3";
    $computer = $computer.toupper();
    $deviceID = $disk.DeviceID;
    foreach($disk in $disks)
    {
        $freeSpaceGB = [Math]::Round([float]$disk.FreeSpace / 1073741824, 2);
        if($freeSpaceGB -lt $minGbThreshold)
        {
            $smtp = New-Object Net.Mail.SmtpClient($smtpAddress)
            $msg = New-Object Net.Mail.MailMessage
            $msg.To.Add($toAddress)
            $msg.From = $fromAddress
            $msg.Subject = “Diskspace below threshold ” + $computer + "\" + $disk.DeviceId
            $msg.Body = $computer + "\" + $disk.DeviceId + " " + $freeSpaceGB + "GB Remaining";
            $smtp.Send($msg)
        }
    }
}

答案 1 :(得分:0)

好吧,$freeSpaceGB = [Math]::Round([float]$disk.FreeSpace / 1073741824);仅将可用驱动器空间(以位为单位)四舍五入为可读的内容(在本例中为GB)。这样一来,您就不会得到像120.237812042236这样的回报。这个$computer = $computer.toupper();只是将所有“字符”变成大写字母。

至于为什么它不执行if语句所期望的工作,您实际上是在将转换为位数的位数转换为可读形式的GB的数字进行比较。因此您有效地询问了120 -lt 53687091200

我会将50gb更改为50,或删除以后发生的转换。