编辑:问题已得到解答,请参阅我的帖子底部的最终脚本...
伙计,我是一个 powershell 新手......
我有这个链接:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/da3fee00-e79d-482b-91f2-7c729c38068f
我想用它来获取服务器列表,根据该列表运行它,然后获取每个服务器的磁盘空间报告,类似于:
服务器1
C:总计=120GB 可用空间=60GB D:总计=400GB 可用空间=200GB
ETC。
问题是...
我不知道该如何处理该链接上的脚本才能使其工作。将其复制/粘贴到记事本中并另存为 .ps1??描述中似乎不是那样的。
如果我从带有 PS 的 Win7 机器上运行它,它会起作用吗?还是每个服务器都必须安装 Powershell 才能使远程 PS 脚本起作用?
有没有办法设置脚本来给我发送电子邮件?这样我就可以将其设置为每周任务或类似的任务。
谢谢你!
========
最终脚本
function Get-FreeDisk
{
[CmdletBinding()]
param(
[Parameter(Position=0, ValueFromPipeline=$true)]
[string[]]$Computername="localhost",
[int]
[ValidateRange(0,100)]
$MinPercFree = 100,
[Management.Automation.PSCredential]$Credential = ([Management.Automation.PSCredential]::Empty)
)
begin{
[String[]]$computers = @()
}
process{
$computers += $Computername
}
end{
Get-WmiObject -computername $computers -Credential $Credential `
-Query "select __SERVER, Caption,Label,Capacity,FreeSpace from Win32_Volume where DriveType != 5 and Capacity > 0" | `
Add-Member -Name Free -MemberType ScriptProperty -PassThru -Value {($this.FreeSpace/10000) / ($this.Capacity/1000000)} | `
Where { $_.Free -lt $MinPercFree } | `
sort __SERVER,Caption | `
Format-Table @{Label="Computer"; Expression={$_.__SERVER}}, Caption, Label,`
@{Label="Size/MB"; FormatString="{0,7:N0}"; Expression={$_.Capacity / 1mb}},`
@{Label="FreeSpace/MB"; FormatString="{0,7:N0}"; Expression={$_.Freespace / 1mb}}, `
@{Label="Free"; FormatString="{0,3:N0}%"; Expression={$_.Free}} -AutoSize
}
}
Get-Content .\servers.txt | Get-FreeDisk | Format-Table -AutoSize | Out-File diskusage.txt
Send-MailMessage -To [email protected] -Subject "Server Disk Report" -From [email protected] -SmtpServer mail.domain.com -Attachments "diskusage.txt"
答案1
对于你的观点:
- 见下文
- 远程计算机不需要安装 PS。只有运行命令的计算机才需要安装 PS
- 按照以下说明操作,它应该可以正常工作。您不需要根据您的环境对其进行自定义。
它是一个函数,因此您需要将其加载到您的环境中。您可以通过几种方式来执行此操作。
- 在当前会话中输入
- 将其添加到您的个人资料中(在这种情况下,我首选的方法)
要将其添加到您的个人资料:
- 在 PS 中,输入
notepad $profile
,这将启动记事本,其中包含您的配置文件脚本。配置文件脚本是每次启动 PS 会话时都会执行的脚本,可让您自动执行一些操作,例如设置环境变量、别名、会话函数(例如此函数)等。请注意,此文件默认不存在,因此如果您尚未创建它,则可能需要创建它。路径为%USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
(使用我的文档而不是 XP 的文档) - 将该代码粘贴到记事本窗口中,以 开头
function
并以 结尾。如果需要,}
您也可以添加一行,但这不是必需的。该命令将使您可以键入,而不必键入整个命令new-alias
new-alias
df
Get-Freedisk
- 保存并关闭文件
- 重新启动 PS,或者键入
. $profile
以使更改生效。
答案2
- 如果您将其复制并粘贴到 ps1 文件中,则您可以运行该文件以将该函数加载到您当前的 PS 环境中。
- 该功能看起来像是针对 WMI 运行的,它应该可以在 WinXP 及更高版本上运行。
- 是的,您可以编写一个包含此功能及其必要信息的脚本,以便通过电子邮件发送。
例如:
function Get-FreeDisk
{
[CmdletBinding()]
param(
[Parameter(Position=0, ValueFromPipeline=$true)]
[string[]]$Computername="localhost",
[int]
[ValidateRange(0,100)]
$MinPercFree = 100,
[Management.Automation.PSCredential]$Credential = ([Management.Automation.PSCredential]::Empty)
)
begin{
[String[]]$computers = @()
}
process{
$computers += $Computername
}
end{
Get-WmiObject -computername $computers -Credential $Credential `
-Query "select __SERVER, Caption,Label,Capacity,FreeSpace from Win32_Volume where DriveType != 5 and Capacity > 0" | `
Add-Member -Name Free -MemberType ScriptProperty -PassThru -Value {($this.FreeSpace/10000) / ($this.Capacity/1000000)} | `
Where { $_.Free -lt $MinPercFree } | `
sort __SERVER,Caption | `
Format-Table @{Label="Computer"; Expression={$_.__SERVER}}, Caption, Label,`
@{Label="Size/MB"; FormatString="{0,7:N0}"; Expression={$_.Capacity / 1mb}},`
@{Label="FreeSpace/MB"; FormatString="{0,7:N0}"; Expression={$_.Freespace / 1mb}}, `
@{Label="Free"; FormatString="{0,3:N0}%"; Expression={$_.Free}} -AutoSize
}
}
$emailFrom = "[email protected]"
$emailTo = "[email protected]"
$subject = "Free Disk Space Report"
$body = Get-Content .\servers.txt | Get-FreeDisk | Out-String
$smtpServer = "mail.example.com"
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)
将其放入名为 email_freedisk.ps1 的文件中;然后设置计划任务来运行它。
您只需要一个包含服务器名称列表的文件,每行一个,名为 servers.txt。