Я искал подобное решение и ударив головой в стену. После тонны поиска я убедился, что могу сделать это сам. Это требует 3 скриптов, 1 bat-файл и 2 vbs-скрипта (потому что я действительно отправляю предупреждения перед предупреждениями). Предупреждения отправляются по электронной почте и могут быть проигнорированы через час, но оповещения отправляются на телефоны по электронной почте на шлюзы sms (мне придется работать над получением прямого sms-решения в конце концов).
Начнем. Вот файл летучая мышь, которая определяет, сколько свободного места на диске в вопросе:
@echo off
:: Copyright Lou Spinuso 2017
:: This script calculates the amount of free space on a disk and returns the percentage
:: This can be used with a task scheduler job to verify that more than 10%
:: (or prefered threshold) of disk is available and then set to send alerts if it fails
:: You will require setting the path to where grep and awk exists as these are required
:: in order to extract the values necessary
:: alternatively you can use find and for to get the right values
:: this is needed to enable setting some variables in the IF statement
setlocal EnableDelayedExpansion
:: SCRIPT_HOME = home directory for script and VB Script
:: DISK_TEST = Disk to test
:: GNU_TOOLS = location of grep and awk
:: DTFile = log file written with total disk size
:: DFFile = log file written with free disk space
set SCRIPT_HOME=C:\Monitor\Disk
set DISK_TEST=C:
set GNU_TOOLS=c:\gnu_tools\bin
set DTFile=C:\Monitor\disktotal.log
set DFFile=C:\Monitor\diskfree.log
set WarnValue=10
set AlertValue=5
set PATH=%PATH%;%GNU_TOOLS%
::fsutil is a built-in windows application
fsutil volume diskfree %DISK_TEST%|grep -i "total # of bytes" |awk "{print $6}" >%DTFile%
fsutil volume diskfree %DISK_TEST%|grep -i "total # of free bytes" |awk "{print $7}" >%DFFile%
:: setting variables from files since batch files can't do it
:: directly from a command that I've been able to find
set /P DiskTotal= < %DTFile%
set /P DiskFree= < %DFFile%
:: call to function that calculates the length of the variables
:: for disk size. This is because set /a will only calcuate
:: 32 bits or up to 2,147,483,647, or 2 GB
:: and fsutil returns number of bytes which can get up to TB's
:: Using this we can effectively chop the right most digits
:: effectively dividing by orders of magnitude later
call :strlen DiskTotalLen DiskTotal
call :strlen DiskFreeLen DiskFree
::echo DiskTotalLen= %DiskTotalLen%
::echo DiskFreeLen = %DiskFreeLen%
:: setting variables just in case we are working with small disks
set DFLLeftMost=%DiskFreeLen%
set DTLLeftMost=%DiskTotalLen%
:: if statement that checks if numbers we're looking at are
:: 9,999,999 or smaller. This is because we need to make the
:: disk free variable 2 oom > than the disk size variable
:: in order to have returned a whole number
:: (no decimal values are returned)
:: also, as a result of using "setlocal EnableDelayedExpansion"
:: we should use ! instead of % in the if statement
if %DiskTotalLen% GTR 7 (
set /a Subtractor=!DiskTotalLen! - 7
set /a DTLLeftMost=!DiskTotalLen!-!Subtractor!
set /a DFLLeftMost=!DiskFreeLen!-!Subtractor!+2
)
:: dividing values by oom
call set DiskFree=%%DiskFree:~0,%DFLLeftMost%%%
:: echo %DiskFree%
call set DiskTotal=%%DiskTotal:~0,%DTLLeftMost%%%
:: echo %DiskTotal%
:: set value in text file for reading
set /a DiskPercent=%DiskFree%/%DiskTotal%
if %DiskPercent% LSS %WarnValue% (
if %DiskPercent% LSS %AlertValue% (cscript.exe %SCRIPT_HOME%\Alert.vbs "!COMPUTERNAME!" "!DiskPercent!"
) ELSE (cscript.exe %SCRIPT_HOME%\Warn.vbs "!COMPUTERNAME!" "!DiskPercent!")
)
::echo %DiskPercent% > c:\monitor\diskpercent.log
::echo %DiskPercent%
goto :eof
:: function to count the length of a variable. Not sure what this all
:: means, this was written by 'jeb' on stackoverflow
:: ht tp://stack overflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file
:strlen <resultVar> <stringVar>
(
setlocal EnableDelayedExpansion
set "s=!%~2!#"
set "len=0"
for %%P in (4096 2048 1024 512 128 64 32 16 8 4 2 1) do (
if "!s:~%%P,1!" NEQ "" (
set /a "len+=%%P"
set "s=!s:~%%P!"
)
)
)
(
endlocal
set "%~1=%len%"
exit /b
)
Отсюда мы теперь нужны VBS скрипты, которые будут посылать электронную почту. Вот сценарий «alert» vbs, названный, точно, «alert.vbs». Также требуется вторая vbs, почти идентичная названной, «warn.vbs». Вы должны убедиться, что вы правильно установить значения для
- objEmail.From
- objEmail.To
- objEmail.Configuration.Fields.Item тот, который указывает SMTP-сервер
также порт для вашего почтового сервера, если он не является 25.
if WScript.Arguments.Count = 0 then
WScript.Echo "Missing Parameters"
end if
Set objEmail = CreateObject("CDO.Message")
objEmail.From = "[email protected]"
objEmail.To = "[email protected]"
objEmail.Subject = "ALERT!!!! Server "+WScript.Arguments(0)+" is low on disk space"
objEmail.Textbody = "Critical disk space issue. Please clear some space on C drive on server . " + WScript.Arguments(0)
objEmail.Textbody = objEmail.Textbody + vbCrLf + "Server is at " + WScript.Arguments(1) +" percent free Disk Space"
objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/sendusing")=2
'Name or IP of remote SMTP server
objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/smtpserver")="mail.yourcompany.com"
'Server port
objEmail.Configuration.Fields.Item ("ht tp://schemas.micro soft.com/cdo/configuration/smtpserverport")=25
objEmail.Configuration.Fields.Update
objEmail.Send
set objEmail=nothing
Затем я установил их для запуска на сервере в планировщике задач каждые 15 минут, а когда свободное место на диске ниже порогового значения (в процентах), отправляется предупреждение или предупреждение.
Надеюсь, я ответил на этот вопрос достаточно хорошо для достаточно других людей, которые ищут аналогичное решение.
Заключительное примечание, мне пришлось разбить «urls» в коде, потому что у меня недостаточно репутации, чтобы публиковать их. Вы должны иметь возможность просто удалить пробелы и партии.
Благодарим за показ начального пути. Я сделал шаги, как было предложено. Ничего не произошло. Установите значение порога на 80, чтобы запустить его правильно. My C Drive 95GB не содержит 227 ГБ. D составляет 155 ГБ без 227 ГБ. Я изменил его, чтобы отобразить сообщение, и оно тоже не отображается. В средстве просмотра событий невозможно найти 2013. Я не обычный пользователь окон, а Linux. Поэтому, пожалуйста, уточните, где я делаю неправильно. – fatherazrael
Для мероприятия вам не нужно найти идентификатор, просто введите номер (2013). Это идентификатор события, определенный Microsoft, 'Ошибка 2013 - Диск находится на или около емкости '. – Abhishek
Я думаю, что ваша проблема не решена, я отредактировал свой вопрос и предоставил ссылку, которая выполнит задачу для вас через 'Sql Server'. – Abhishek