Powershell – Подсчет свободного места на дисках

powershell logo
Наиболее часто возникающая у многих проблема: «Закончилось свободное место на жестком диске.»

Каждый хотя бы раз с ней сталкивался и по разному решал эту проблему, но малый процент задумывался о предупреждении её.

Если в вашем подчинении находится десяток-другой компьютеров то пройтись по ним и посмотреть и посмотреть на состояние дисков не составит труда. а если компьютеров больше ста, например 500 или 600 или 1000 и больше?

Предлагаю рассмотреть скрипт который собирает данные о свободном месте на дисках.

Получить данные о свободном месте на нескольких компьютерах довольно легко, в WMI есть класс Win32_LogicalDisk и одним из его атрибутов является freespace.

Powershell – наше все…

Им то мы и воспользуемся. Нужно немного времени и терпения.

Итак.
1. готовим файл hostlist.txt вот такого содержания

host1
host2
host3

2. Создаем powershell-скрипт

Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer (Get-Content hostlist.txt) | Select SystemName,DeviceID,@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | ft

На выходе получаем табличку в которой будет указано имя хоста, буква диска, размер и свободное место.

Если результат необходимо отправить в файл слегка меняем скрипт.

Get-WMIObject Win32_LogicalDisk -filter "DriveType=3" -computer (Get-Content hostlist.txt) | Select SystemName,DeviceID,@{Name="size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="freespace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}} | ft | Out-File result.txt

При необходимости готовый отчет можно отправить администратору на email.


Информация об авторе

Сергей Мариничев.
Вы можете присоединиться ко мне в Facebook или в Twitter.

Если Вам понравилась статья, то вы можете подписаться на RSS.
А также бесплатно подписаться по E-mail и получать актуальную информацию в числе первых.

Получать обновления на email

Вы можете оставить комментарий.

16 Комментариев »

 
  • 1# kop (2 комм.):

    Спасибо за скрипт=)
    Возникает вопрос, есть ли возможность инфу, которая была получена, отправить на почту или sms средствами PoSh?

      Цитировать

    • 2# admin (36 комм.):

      Конечно методики есть.
      В ближайшее время я постараюсь описать процедуру отправки почты (доступна как авторизованная отправка так и анонимная).

      Для обмена данными с SMS-ом предусмотрен формат IDMIF и NOIDMIF, этот вопрос так же будет затронут, но чуть позже.

        Цитировать

  • 4# Евгений (8 комм.):

    Сергей, добрый день!
    Возможно вы что-то подскажите, каким образом можно вывести информацию о свободном месте на сетевоим диске на сайт в локальной сети. Чтобы пользователи понимали, что документ не сохраняется из-за отсутсвия свободно пространства. Заранее спасибо

      Цитировать

  • 6# Александр (18 комм.):

    Доброго времени суток.
    Спасибо за скрипт.
    Но есть небольшой вопрос.
    Как сделать так чтобы подставляя «-computer 192.168.0.250″ (например)
    еще добавить логи и пароль для доступа к этому компьютеру (хочу проверять свободное место в разных сетях)

      Цитировать

    • 7# Сергей Мариничев (687 комм.):

      Примерно так.

      Get-WMIObject Win32_LogicalDisk -filter «DriveType=3″ -computer (read-Host «Enter HostName ot IP») -Credential (Get-Credential) | Select SystemName,DeviceID,@{Name=»size(GB)»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace(GB)»;Expression={«{0:N1}» -f($_.freespace/1gb)}} | ft | Out-File result.txt

      Добавляется только read-Host и Get-Credential

        Цитировать

  • 8# Александр (18 комм.):

    Ммм… read-host я не добавляю, пишу вручную 1 ip добавил -Credential (Get-Credential) да у меня запросило логин и пароль, если ввожу то все работает, а как реализовать это в авто режиме? ввод логина и пароля. Извините за навязчивость.

      Цитировать

  • 10# Дмитрий (9 комм.):

    Добрый день.
    Немного переделал скрипт, чтоб выдавал инфу, если на сервере осталось меньше 5% свободного места
    $i=Get-WMIObject Win32_LogicalDisk -filter «DriveType=3″ -computer (Get-Content servers.txt)| Where-Object -FilterScript{$_.freespace/$_.size -lt 5/100 }
    $c=$i| Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}}

    на 2003 и ХП работает отлично, а на 7 и 2008 ругается на ошибку деления на ноль

      Цитировать

  • 11# Дмитрий (9 комм.):

    ошибочка. скрипт работает если нет сидюков или дисков с нулевым сайзом, но если и поставить проверку на сайз=0 и т.о. исключить его из обработки, то все равно вываливаюсь с ошибкой деления на 0
    Where-Object -FilterScript{$_.size -ne 0 -and $_.freespace/$_.size -lt 5/100 }

      Цитировать

    • 12# Сергей Мариничев (687 комм.):

      Не вижу ошибки и не могу предположить почему выдает деление на 0.
      В скрипте указано что брать только Ficed диски

      -filter «DriveType=3″

      Деление на ноль можно обрабатывать через trap.

      PS у вас powershell v2?

        Цитировать

  • 13# Дмитрий (9 комм.):

    да, 2.0
    Также, если в $i=Get-WMIObject Win32_LogicalDisk -computer (Get-Content servers.txt) | Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}},@{Name=»freeproc»;Expression={«{0:N1}» -f(100*$_.freespace/$_.size)}}|Where-Object {$_.freeproc -lt 5 -and $_.freespace -gt 1}
    $i

    списке серверов оставить 1 сервер с диском проходящим для результата, то результат отобразит верно, но если в списке несколько серверов, то результаты непонятные… также если не подойдёт ни 1 из дисков, то отобразятся все

      Цитировать

  • 15# Дмитрий (9 комм.):

    хм, с другого сработало корректно.
    Окончательный вариант получился такого вида:

    $i=Get-WMIObject Win32_LogicalDisk -filter «DriveType=3″ -computer (Get-Content C:\Backup_script\PowerShell\servers.txt)| Where-Object -FilterScript{$_.freespace -gt 1 -and $_.freespace/$_.size -lt 5/100 }
    $r=$i| Select SystemName,DeviceID,@{Name=»size»;Expression={«{0:N1}» -f($_.size/1gb)}},@{Name=»freespace»;Expression={«{0:N1}» -f($_.freespace/1gb)}}
    ForEach ($Info in $r)
    {
    Write-Host «sending mail»
    $mail = New-Object System.Net.Mail.MailMessage
    $mail.From = New-Object System.Net.Mail.MailAddress(«test@test.net»)
    $mail.To.Add(«jabber@куданадо.ru»)

    $mail.Subject = «Недостаточно свободного места.»;
    $mail.Body = «На сервере » + $info.SystemName + » на диске » + $info.DeviceID + » недостаточно свободного места (менее 5%). Осталось: » + $info.FreeSpace + «Gb» + » из » + $info.size+»Gb»

    $smtp = New-Object System.Net.Mail.SmtpClient
    $smtp.host = «куданадо.ru»

    $smtp.Send($mail)
    }

    Вот еще вопрос. Если компьютер не в домене, то как запустить с моей машины(доменной), но програмно указать другого пользователя? ну и в скрипте соответственно прописать домен.логин.пароль. Домен и логин то я нашел, а вот пароль нет :(

      Цитировать

    • 16# Сергей Мариничев (687 комм.):

      Интерактивно так

      $cred = Get-Credential («DOMAIN\User»)
      Get-WMIObject … -credential $cred

      Если надо сохранить данные то вот так

      1. сохраняем в файл

      $Credential = Get-Credential
      $credential.Password | ConvertFrom-SecureString | Set-Content $File

      2. прочитать из файла

      $pwd = Get-Content $File | ConvertTo-SecureString
      $credential = New-Object System.Management.Automation.PsCredential($user,$pwd)
      $credential

      3. использовать

      Get-WMIObject … -credential $credential

      Как то вот так. Надо проверить т.к. пишу по памяти :)

        Цитировать

 

Добавить комментарий

XHTML: Вы можете использовать тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>