- Вопрос или проблема
- То же самое касается -ComputerName, однако странно, что он все равно выполняется и создает CSV-файл, но вместо 4 серверов у него только списки дискового размера локального хоста
- Ответ или решение
- Подготовка
- Скрипт получения свободного места на диске
- Описание скрипта
- Возможные проблемы и их решения
- Заключение
Вопрос или проблема
Мне нужно получить отчеты о свободном дисковом пространстве на наших серверах 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, я предлагаю вам собственный, более оптимизированный скрипт. Ниже приведен детализированный подход к решению вашей задачи.
Подготовка
Перед тем как начать, убедитесь, что у вас есть следующие требования:
- Доступ к серверам Exchange с необходимыми правами.
- Должен быть установлен PowerShell версии 5.1, что у вас уже есть, согласно вашим данным.
- Проверьте файл с именами серверов; в вашем случае это
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-файл, который вы можете использовать для дальнейшего анализа.
Возможные проблемы и их решения
-
Ошибка
-ErrorAction
не распознается: В вашем изначальном коде вы использовали-ErrorAction
непосредственно в строке, это должно быть частью вызова командыGet-WmiObject
. Убедитесь, что опции передаются корректно. -
Данные только с локального сервера: Убедитесь, что серверы, упомянутые в вашем CSV-файле, доступны из сети, и у вас есть необходимые права, чтобы их опрашивать. Также проверьте, что вам не мешают настройки брандмауэра.
Заключение
Запустите предложенный выше скрипт в PowerShell, и он создаст отчет о свободном дисковом пространстве на всех серверах. Вы сможете использовать CSV-файл для анализа и хранения данных. Не забывайте адаптировать пути к файлам под вашу файловую структуру.