用PowerShell監控磁碟空間

在伺服器上經常會執行一些程式,這些程式或多或少都會需要將一些執行的過程記錄在log檔中。如果沒有定期去清除這些log檔的話,時間一久伺服器上的磁碟空間就會被用光。

不過,因為是伺服器上的自動排程程式,所以一般人一旦設定好就不再會去管理。久而久之可能就在某一天發生磁碟空間不足,造成程式無法執行的問題。

我想要監控伺服器的磁碟空間的應用程式應該是不少,不過最好的方式當然是能用Windows Server本身內建的功能是最好。

最近微軟提供了PowerShell的指令集工具。這個工具有很多的伺服器管理功能。當然也可以用來監控磁碟空間了。找了一下網路上,果然有人在分享已寫好的用PowerShell監控磁碟空間的程式碼

即然有現成的當然就拿來改一下使用看看囉。

要執行的話,需要在PowerShell的命令列視窗中輸入 .\。要加個「.\」。不然,直接打檔名是無法執行的。

如果第一次執行有問題的話,應該也是安全性的問題。就要先執行以下的指令:

Set-ExecutionPolicy RemoteSigned

如果你的WinServer 2008找不到PowerShell,是因為預設上是沒安裝的,請自行由伺服器管理員安裝PowerShell

如果直接用命令列執行PowerShell指令檔,而不用先進入PowerShell的方式如下:

powershell -command "& './CheckQuota.ps1'"

原本的版本中只能寄警告信通知一位管理員,後來我修改了一下,可以讀取一份清單,以便將警告訊息傳給多位管理員。程式碼如下:

$computers=(Get-Content CheckComputerList.txt)
#單位是MB
$WARING='5000000000'
$SMTP='email.polaris.com.tw'
$TO='justin_Lin@polaris.com.tw;justin1021@gmail.com'
$FROM='FMSQLAdmin@polaris.com.tw'
$MonitorList=(Get-Content MonitorManager.txt)

foreach ($computer in $computers)
{
    #$ICMP=get-wmiobject -query "select * from win32_pingstatus where address='$COMPUTER'"
    $ICMP=get-WmiObject Win32_PingStatus -filter  "Address='$COMPUTER' "
 
 #justin
 #..Write-Output $ICMP
 
    if ($ICMP.StatusCode -eq '0')
    {
  #justin
  #..Write-Output "Check '$COMPUTER'" 
  #..Get-WmiObject -computer $COMPUTER win32_logicaldisk
  
        Get-WmiObject -computer $COMPUTER win32_logicaldisk  |? {$_.drivetype -eq '3'}|%{       
            if (([int64]($_.freespace/1MB)) -le "$WARING")
            {
    #justin
    #..Write-Output "Waring '$COMPUTER' '$_.freespace'"
    
    
    $ID=$_.deviceid
    $F=[int32]($_.freespace/1MB)
    $S="Waring $computer disk $ID Freespace $F MB"
   
    foreach( $Monitor in $MonitorList )
    {
     Send-MailMessage -to $Monitor -from $FROM -subject "$S"  -body "$S" -smtp $SMTP
    }
            }
        }
    }
    else
    {   
        $N="Waring $computer not respond !"
        Send-MailMessage -to $TO -from $FROM -subject "$N"  -body "$N" -smtp $SMTP
    }
}

PowerShell參考資料:
[1] 一些使用技巧

留言

這個網誌中的熱門文章

DOS Batch指令檔中如何記錄log資訊

用捷徑方式執行需帶入命令列參數的Windows Form程式

使用regular expression來match中括號(square bracket)