当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 自定义属性的力量

作者:精品下载站 日期:2024-12-14 07:48:41 浏览:14 分类:玩电脑

自定义属性的力量


前几天,PowerShell MVP Adam Bertram 发表了一篇有关在 Select-Object 中使用自定义属性的文章。这是一篇好文章,因为它让您从对象而不是简单文本的角度思考 PowerShell。但我想以 Adam 的文章为起点,进一步探讨他的想法。我将使用 Adam 的相同示例作为学习工具。不要因为获取相同信息的其他方式而分心。过程和技术在这里很重要。

每当我使用 PowerShell 时,我总是在思考如何大规模使用它。如何获取 10 或 100 台服务器的相同信息?当然,此时我需要确保在结果中包含计算机名称。首先,我将尝试用一台计算机进行一些操作。

Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName chi-hvr1 |
Select PSComputername,@{Name = "MemoryGB";Expression = { ($_.Capacity | Measure -sum).sum/1GB}}

[玩转系统] 自定义属性的力量

接近但不完全是。 Get-CimInstance 正在将多个对象写入管道。相关服务器有 2 8GB 内存条,正如您在输出中看到的那样。我需要更多符合 Adam 最初想法的东西,将其变为 16GB。

我真正想要的是 Measure-Object 的 Sum 属性,并且我需要添加一个 Computername 属性。我会稍微扭转局面。

Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName chi-hvr1 -PipelineVariable pv|
Measure-Object -Property capacity -Sum |
Select @{Name="Computername";Expression={$pv.pscomputername}},
@{Name="MemoryGB";Expression = {$_.sum/1GB}}

[玩转系统] 自定义属性的力量

这是可行的,因为我使用的是 PowerShell 4 中引入的通用 PipelineVariable 参数。所发生的情况是,Get-CimInstance 的管道输出存储在变量 pv 中,我稍后可以在表达式中访问该变量。在我的例子中,我使用 $pv 为计算机名定义一个新属性,并将其添加到 Measure-Object 的选定输出中。

但是,如果我对多个计算机名称尝试此操作,则不会得到预期的结果。

[玩转系统] 自定义属性的力量

这是因为我正在将所有服务器的物理内存实例相加,这并不是我真正想要的。相反,在这种情况下,我必须单独处理每台计算机。

$computers = "chi-hvr1","chi-hvr2","chi-web02","chi-win10","chi-tp04","win81-ent-01"
foreach ($computer in $computers) {
    Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $computer -PipelineVariable pv|
    Measure-Object -Property capacity -Sum |
    Select @{Name="Computername";Expression={$pv.pscomputername}},
    @{Name="MemoryGB";Expression = {$_.sum/1GB}}
}

[玩转系统] 自定义属性的力量

使用 ForEach 枚举器时需要注意的一件事是,您无法将输出通过管道传输到另一个 cmdlet(例如 Export-CSV),除非您将结果显式保存到变量中。

$data = Foreach ($computer in $computers) { …

然后您可以将 $data 通过管道传递给其他 cmdlet。您可以使用 ForEach-Object,尽管它可能有点难以理解。

$computers | foreach {
Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $_ -PipelineVariable pv|
    Measure-Object -Property capacity -Sum |
    Select @{Name="Computername";Expression={$pv.pscomputername}},
    @{Name="MemoryGB";Expression = {$_.sum/1GB}}
} | Sort MemoryGB,Computername

但如果您需要将输出通过管道传输到其他地方,这会变得更容易。

[玩转系统] 自定义属性的力量

为了结束这个过程,让我们全力以赴并定义更多自定义属性。

$computers | foreach {
Get-CimInstance -ClassName Win32_PhysicalMemory -ComputerName $_ -PipelineVariable pv|
    Measure-Object -Property capacity -Sum |
    Select @{Name = "Computername";Expression={$pv.pscomputername}},
    @{Name = "Computer";Expression = {
     $cs = Get-CimInstance Win32_computersystem -ComputerName $pv.psComputername
     #construct a string with manufacturer and model
     "$($cs.Manufacturer):$($cs.Model)"
    }},
    @{Name = "MemoryGB";Expression = {$_.sum/1GB}},
    @{Name="NumberSticks";Expression = {$_.Count}}
} | Sort MemoryGB,Computername

[玩转系统] 自定义属性的力量

尽管我从 Measure-Object 的输出中选择了一些属性,但我还定义了其他几个即时计算的属性。你可以用这个技巧做很多事情,但如果我在任何地方失去了你,请告诉我。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯