Скрипт PowerShell для отчета о свободном дисковом пространстве на серверах

Вопрос или проблема

Мне нужно получить отчеты о свободном дисковом пространстве на наших серверах Exchange. Я нашел эту ссылку: https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Script-Sample-f7164554

Но я не могу успешно его запустить… кто-нибудь знает лучший/проще способ сделать это? Мне не нужен отчет по электронному письму… просто в виде CSV-файла. Я использую Windows 10… и $PSVersionTable показывает:

Имя                           Значение    
PSVersion                      5.1.14393.3053                                                                                                                                                 
PSEdition                      Desktop                                                                                                                                                        
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}                                                                                                                                        
BuildVersion                   10.0.14393.3053                                                                                                                                                
CLRVersion                     4.0.30319.42000                                                                                                                                                
WSManStackVersion              3.0                                                                                                                                                            
PSRemotingProtocolVersion      2.3                                                                                                                                                            
SerializationVersion           1.1.0.1

Ошибка, которую я получаю:

-ErrorAction : Term ' -ErrorAction ' не распознается как имя cmdlet, функции, скрипта или исполняемой программы. Проверьте написание имени или, если путь был включен, проверьте, что путь корректен, и попробуйте снова.
В C:\scripts\getdiskspace.ps1:7 символ:1
+ -ErrorAction SilentlyContinue
+ ~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (-ErrorAction:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

То же самое касается -ComputerName, однако странно, что он все равно выполняется и создает CSV-файл, но вместо 4 серверов у него только списки дискового размера локального хоста

Мне удалось сделать так, чтобы этот скрипт отправлял электронную почту, и я могу использовать планировщик задач для его еженедельного запуска, просто нужно разобраться с этой ошибкой и почему он отображает только один сервер (локальный хост) размер диска. Вот точный скрипт, который я использовал:

$File = Import-csv C:\scripts\getdiskspace.csv
$DiskReport = ForEach ($Servernames in ($File))  

{
Get-WmiObject win32_logicaldisk <#-Credential $RunAccount#> ` 
-ComputerName $Servernames -Filter "Drivetype=3" ` 
-ErrorAction SilentlyContinue 

#возврат только дисков с 
#свободным пространством менее   
#или равным 0.1 (10%) 

#Where-Object {   ($_.freespace/$_.size) -le '0.1'} 

}  

#создание отчетов 

$DiskReport |  

Select-Object @{Label = "Имя сервера";Expression = {$_.SystemName}}, 
@{Label = "Буква диска";Expression = {$_.DeviceID}}, 
@{Label = "Общая емкость (ГБ)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}}, 
@{Label = "Свободное пространство (ГБ)";Expression = {"{0:N1}" -f( $_.Freespace / 1gb ) }}, 
@{Label="Свободное пространство (%)"; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}} | 

#Экспорт отчета в CSV-файл (Отчет о дисках) 

Export-Csv -path "C:\scripts\DiskReport_$logDate.csv" -NoTypeInformation 

#Отправить отчет о диске, используя модуль электронных почтовых сервисов 
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; 

#Import-Module "\\Servername\ServerStorageReport\ExchangeModule\Exchange.ps1" -ErrorAction SilentlyContinue 

#Прикрепите и отправьте отчет CSV (самый последний отчет будет прикреплен) 

$messageParameters = @{                         
                Subject = "Еженедельный отчет по хранению сервера"                         
                Body = "Прилагается еженедельный отчет по хранению сервера. Все отчеты находятся в C:\scripts\, но самый последний отчёт отправляется еженедельно"                    
                From = "Имя электронной почты1 <[email protected]>"                         
                To = "Имя электронной почты1 <[email protected]>" 
                CC = "Имя электронной почты2 <[email protected]>" 
                Attachments = (Get-ChildItem C:\scripts\*.* | sort LastWriteTime | select -last 1)                    
                SmtpServer = "mail.example.com"                         
            }     
Send-MailMessage @messageParameters -BodyAsHtml

—– Ниже показано, как выглядит мой CSV:

Сервера
server1
server2
server3
server4

Хорошо, это сработало:

$LogDate = get-date -f yyyyMMddhhmm
$File = Get-Content -Path C:\StorageReport\Servers.txt

$DiskReport = ForEach ($Servernames in ($File)) 

{Get-WmiObject win32_logicaldisk <#-Credential $RunAccount#> `
-ComputerName $Servernames -Filter "Drivetype=3" `
-ErrorAction SilentlyContinue 
} 

$DiskReport | 

Select-Object @{Label = "Имя сервера";Expression = {$_.SystemName}},
@{Label = "Буква диска";Expression = {$_.DeviceID}},
@{Label = "Общая емкость (ГБ)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}},
@{Label = "Свободное пространство (ГБ)";Expression = {"{0:N1}" -f( $_.Freespace / 1gb ) }},
@{Label="Свободное пространство (%)"; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}} |

Export-Csv -path "C:\StorageReport\DiskReport_$logDate.csv" -NoTypeInformation

Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn; 

$messageParameters = @{                        
                Subject = "Еженедельный отчет по хранению сервера"                        
                Body = "Прилагается еженедельный отчет по хранению сервера. Все отчеты находятся в C:\StorageReport\, но самый последний отправляется еженедельно"                   
                From = "Имя электронной почты1 <[email protected]>"                        
                To = "Имя электронной почты1 <[email protected]>"
                CC = "Имя электронной почты2 <[email protected]>"
                Attachments = (Get-ChildItem C:\StorageReport\*.* | sort LastWriteTime | select -last 1)                   
                SmtpServer = "SMTPServerName.com"                        
            }   
Send-MailMessage @messageParameters -BodyAsHtml

$Servers = Get-Content "C:\users\$env:username\desktop\input.txt"
$Drives = "C:","D:","E:"

$report = @()

#Цикл по каждому серверу
Foreach($Server in $Servers)
{
    $Server = $Server.trim()
    Write-Host "Обработка $Server" -ForegroundColor Green
    Try
    {
        $Disks = Get-WmiObject -Class win32_logicaldisk -ComputerName $Server -ErrorAction Stop
    }
    Catch
    {
        $_.Exception.Message
        Continue
    }    
        If(!$Disks)
        {
            Write-Warning "Что-то пошло не так"
        }
        Else
        {
            # Добавление свойств к объекту
            $Object = New-Object PSCustomObject
            $Object | Add-Member -Type NoteProperty -Name "ИмяСервера" -Value $Server

            Foreach($Letter in $Drives)
            {
                Switch ($Letter)
                {
                    "C:"     { $Val = "OSDDisk (C:)"}
                    "D:"     { $Val = "Данные (D:)"}
                    "E:"     { $Val = "Точка монтирования (E:)"}
                }

                $FreeSpace = ($Disks | Where-Object {$_.DeviceID -eq "$Letter"} | Select-Object @{n="Свободное пространство";e={[math]::Round($_.FreeSpace/1GB,2)}}).freespace 
                If($FreeSpace)
                {
                    $Value = "$Freespace" + " ГБ"
                    $Object | Add-Member -Type NoteProperty -Name "$Val" -Value $Value   
                }
                Else
                {
                    $Object | Add-Member -Type NoteProperty -Name "$Val" -Value "(не найдено)"
                }
            }
            $report += $object
        }
} 

#Отображение результатов
return $report

#Сохранение результатов в CSV-файл
$report | Export-Csv -Path C:\users\$env:username\desktop\free_space.csv -NoTypeInformation -Force
Поделиться:

Ответ или решение

Для того чтобы получить отчеты о свободном дисковом пространстве на серверах Exchange с помощью PowerShell, я предлагаю вам собственный, более оптимизированный скрипт. Ниже приведен детализированный подход к решению вашей задачи.

Подготовка

Перед тем как начать, убедитесь, что у вас есть следующие требования:

  1. Доступ к серверам Exchange с необходимыми правами.
  2. Должен быть установлен PowerShell версии 5.1, что у вас уже есть, согласно вашим данным.
  3. Проверьте файл с именами серверов; в вашем случае это C:\Scripts\Servernames.csv или C:\StorageReport\Servers.txt, содержащий список наименований серверов.

Скрипт получения свободного места на диске

# Установка даты для имени файла
$LogDate = Get-Date -Format "yyyyMMdd_hhmm"

# Чтение имени серверов из файла
$Servers = Get-Content "C:\scripts\Servernames.csv"

# Массив для хранения отчета
$DiskReport = @()

# Обработка каждого сервера
ForEach ($Server in $Servers) {
    $Server = $Server.Trim() # Удаление лишних пробелов
    Write-Host "Обрабатывается сервер: $Server" -ForegroundColor Green

    try {
        $Disks = Get-WmiObject -Class win32_logicaldisk -ComputerName $Server -Filter "DriveType=3" -ErrorAction Stop

        # Сбор информации о дисках
        foreach ($Disk in $Disks) {
            $DiskReport += [PSCustomObject]@{
                "Server Name"       = $Server
                "Drive Letter"      = $Disk.DeviceID
                "Total Capacity (GB)" = "{0:N1}" -f ($Disk.Size / 1GB)
                "Free Space (GB)"   = "{0:N1}" -f ($Disk.FreeSpace / 1GB)
                "Free Space (%)"    = "{0:P0}" -f ($Disk.FreeSpace / $Disk.Size)
            }
        }
    }
    catch {
        Write-Error "Ошибка при получении данных с сервера $Server: $_"
    }  
}

# Экспортировать отчет в формат CSV
$DiskReport | Export-Csv -Path "C:\Scripts\DiskReport_$LogDate.csv" -NoTypeInformation -Force

Write-Host "Отчет о дисковом пространстве успешно сохранен!"

Описание скрипта

  • Скрипт начинает с установки временной метки для имени файла.
  • Читает имена серверов из указанного файла.
  • Для каждого сервера он получает информацию о логических дисках с помощью Get-WmiObject и сохраняет результаты в настраиваемый объект, который добавляется в массив $DiskReport.
  • Затем результат экспортируется в CSV-файл, который вы можете использовать для дальнейшего анализа.

Возможные проблемы и их решения

  1. Ошибка -ErrorAction не распознается: В вашем изначальном коде вы использовали -ErrorAction непосредственно в строке, это должно быть частью вызова команды Get-WmiObject. Убедитесь, что опции передаются корректно.

  2. Данные только с локального сервера: Убедитесь, что серверы, упомянутые в вашем CSV-файле, доступны из сети, и у вас есть необходимые права, чтобы их опрашивать. Также проверьте, что вам не мешают настройки брандмауэра.

Заключение

Запустите предложенный выше скрипт в PowerShell, и он создаст отчет о свободном дисковом пространстве на всех серверах. Вы сможете использовать CSV-файл для анализа и хранения данных. Не забывайте адаптировать пути к файлам под вашу файловую структуру.

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

Капча загружается...