我需要获取有关我们的 Exchange 服务器上可用磁盘空间的报告。我找到了此链接: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 个服务器,只有本地主机的磁盘大小列表
我能够让此脚本发送电子邮件,并且我可以使用任务计划程序每周运行它,只需找出此错误以及为什么它只显示一个服务器(本地主机)的磁盘大小。这是我使用的确切脚本:
$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: