Мне необходимо получать отчеты о свободном дисковом пространстве на наших серверах обмена. Я нашел эту ссылку:https://gallery.technet.microsoft.com/scriptcenter/PowerShell-Script-Sample-f7164554
Но я не могу успешно запустить его... у кого-нибудь есть лучший/более простой способ сделать это? Мне не нужен отчет по электронной почте... просто как файл csv. Я использую Windows 10... и $PSVersionTable показывает:
Name Value
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 : The term '-ErrorAction' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included,
verify that the path is correct and try again.
At C:\scripts\getdiskspace.ps1:7 char:1
+ -ErrorAction SilentlyContinue
+ ~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (-ErrorAction:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
То же самое для -ComputerName, однако странность в том, что он все равно запускается и создает CSV-файл, но вместо 4 серверов в нем отображаются списки размеров дисков только локального хоста.
Мне удалось заставить этот скрипт отправлять электронное письмо, и я могу использовать планировщик задач, чтобы запускать его еженедельно. Просто нужно выяснить эту ошибку и почему она отображает только один размер диска сервера (localhost). Вот точный скрипт, который я использовал:
$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
#return only disks with
#free space less
#than or equal to 0.1 (10%)
#Where-Object { ($_.freespace/$_.size) -le '0.1'}
}
#create reports
$DiskReport |
Select-Object @{Label = "Server Name";Expression = {$_.SystemName}},
@{Label = "Drive Letter";Expression = {$_.DeviceID}},
@{Label = "Total Capacity (GB)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}},
@{Label = "Free Space (GB)";Expression = {"{0:N1}" -f( $_.Freespace / 1gb ) }},
@{Label = 'Free Space (%)'; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}} |
#Export report to CSV file (Disk Report)
Export-Csv -path "C:\scripts\DiskReport_$logDate.csv" -NoTypeInformation
#Send disk report using the exchange email module
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;
#Import-Module "\\Servername\ServerStorageReport\ExchangeModule\Exchange.ps1" -ErrorAction SilentlyContinue
#Attach and send CSV report (Most recent report will be attached)
$messageParameters = @{
Subject = "Weekly Server Storage Report"
Body = "Attached is Weekly Server Storage Report.All reports are located in C:\scripts\, but the most recent is sent weekly"
From = "Email name1 <[email protected]>"
To = "Email name1 <[email protected]>"
CC = "Email name2 <[email protected]>"
Attachments = (Get-ChildItem C:\scripts\*.* | sort LastWriteTime | select -last 1)
SmtpServer = "mail.example.com"
}
Send-MailMessage @messageParameters -BodyAsHtml
-----Ниже представлен мой CSV-файл:
Servernames
server1
server2
server3
server4
решение1
хорошо, это сработало:
$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 = "Server Name";Expression = {$_.SystemName}},
@{Label = "Drive Letter";Expression = {$_.DeviceID}},
@{Label = "Total Capacity (GB)";Expression = {"{0:N1}" -f( $_.Size / 1gb)}},
@{Label = "Free Space (GB)";Expression = {"{0:N1}" -f( $_.Freespace / 1gb ) }},
@{Label = 'Free Space (%)'; Expression = {"{0:P0}" -f ($_.freespace/$_.size)}} |
Export-Csv -path "C:\StorageReport\DiskReport_$logDate.csv" -NoTypeInformation
Add-PSSnapin Microsoft.Exchange.Management.PowerShell.SnapIn;
$messageParameters = @{
Subject = "Weekly Server Storage Report"
Body = "Attached is Weekly Server Storage Report.All reports are located in C:\StorageReport\, but the
most recent is sent weekly"
From = "Email name1 <[email protected]>"
To = "Email name1 <[email protected]>"
CC = "Email name2 <[email protected]>"
Attachments = (Get-ChildItem C:\StorageReport\*.* | sort LastWriteTime | select -last 1)
SmtpServer = "SMTPServerName.com"
}
Send-MailMessage @messageParameters -BodyAsHtml
решение2
$Servers = Get-Content "C:\users\$env:username\desktop\input.txt"
$Drives = "C:","D:","E:"
$report = @()
#Looping each server
Foreach($Server in $Servers)
{
$Server = $Server.trim()
Write-Host "Processing $Server" -ForegroundColor Green
Try
{
$Disks = Get-WmiObject -Class win32_logicaldisk -ComputerName $Server -ErrorAction Stop
}
Catch
{
$_.Exception.Message
Continue
}
If(!$Disks)
{
Write-Warning "Something went wrong"
}
Else
{
# Adding properties to object
$Object = New-Object PSCustomObject
$Object | Add-Member -Type NoteProperty -Name "ServerName" -Value $Server
Foreach($Letter in $Drives)
{
Switch ($Letter)
{
"C:" { $Val = "OSDDisk (C:)"}
"D:" { $Val = "Data (D:)"}
"E:" { $Val = "Mountpoint_log (E:)"}
}
$FreeSpace = ($Disks | Where-Object {$_.DeviceID -eq "$Letter"} | Select-Object @{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}).freespace
If($FreeSpace)
{
$Value = "$Freespace" + " GB"
$Object | Add-Member -Type NoteProperty -Name "$Val" -Value $Value
}
Else
{
$Object | Add-Member -Type NoteProperty -Name "$Val" -Value "(not found)"
}
}
$report += $object
}
}
#Display results
return $report
#Save results to CSV file
$report | Export-Csv -Path C:\users\$env:username\desktop\free_space.csv -NoTypeInformation -Force
Share: