Powershell 帮助:有一个“磁盘空间”脚本链接...但我如何使用它?

Powershell 帮助:有一个“磁盘空间”脚本链接...但我如何使用它?

编辑:问题已得到解答,请参阅我的帖子底部的最终脚本...

伙计,我是一个 powershell 新手......

我有这个链接:

http://gallery.technet.microsoft.com/ScriptCenter/en-us/da3fee00-e79d-482b-91f2-7c729c38068f

我想用它来获取服务器列表,根据该列表运行它,然后获取每个服务器的磁盘空间报告,类似于:

服务器1

C:总计=120GB 可用空间=60GB D:总计=400GB 可用空间=200GB

ETC。

问题是...

  1. 我不知道该如何处理该链接上的脚本才能使其工作。将其复制/粘贴到记事本中并另存为 .ps1??描述中似乎不是那样的。

  2. 如果我从带有 PS 的 Win7 机器上运行它,它会起作用吗?还是每个服务器都必须安装 Powershell 才能使远程 PS 脚本起作用?

  3. 有没有办法设置脚本来给我发送电子邮件?这样我就可以将其设置为每周任务或类似的任务。

谢谢你!

========

最终脚本

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

对于你的观点:

  1. 见下文
  2. 远程计算机不需要安装 PS。只有运行命令的计算机才需要安装 PS
  3. 按照以下说明操作,它应该可以正常工作。您不需要根据您的环境对其进行自定义。

它是一个函数,因此您需要将其加载到您的环境中。您可以通过几种方式来执行此操作。

  1. 在当前会话中输入
  2. 将其添加到您的个人资料中(在这种情况下,我首选的方法)

要将其添加到您的个人资料:

  1. 在 PS 中,输入notepad $profile,这将启动记事本,其中包含您的配置文件脚本。配置文件脚本是每次启动 PS 会话时都会执行的脚本,可让您自动执行一些操作,例如设置环境变量、别名、会话函数(例如此函数)等。请注意,此文件默认不存在,因此如果您尚未创建它,则可能需要创建它。路径为%USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1(使用我的文档而不是 XP 的文档)
  2. 将该代码粘贴到记事本窗口中,以 开头function并以 结尾。如果需要,}您也可以添加一行,但这不是必需的。该命令将使您可以键入,而不必键入整个命令new-aliasnew-aliasdfGet-Freedisk
  3. 保存并关闭文件
  4. 重新启动 PS,或者键入. $profile以使更改生效。

答案2

  1. 如果您将其复制并粘贴到 ps1 文件中,则您可以运行该文件以将该函数加载到您当前的 PS 环境中。
  2. 该功能看起来像是针对 WMI 运行的,它应该可以在 WinXP 及更高版本上运行。
  3. 是的,您可以编写一个包含此功能及其必要信息的脚本,以便通过电子邮件发送。

例如:

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。

相关内容