Powershell - 从管道中提取变量

时间:2015-08-07 14:34:09

标签: powershell

这是我第一次使用Powershell,我需要一些查询帮助。

我需要远程连接到公共域上的某些服务器并从每个服务器中提取内存消耗,然后将它们显示到Text文件中。所有这些都与此查询有关:

$serverList = @("DMOBBQ-008","DCOBF1-003","DCOBF1-013","DCOBF2-005","DCOBF2-006","DCOBF2-007","DCOBF2-015","DMOBB8-007","DMOBBE-000","DMOBBQ-005","DMOBBQ-006","DMOBBQ-007","DMOBBR-007","DMOBC4-002","DMOBBR-005","DCOBBN-D06")


ForEach($server in $serverList)
{
    Write-Host $server":"
    $results = (get-process w3wp -computername $server | where-object {$_.privatememorysize -gt 1000000000} | select name, @{l="Private Memory (GB)"; e={$_.privatememorysize / 1gb}}) 
    #Write-Host $results 
    $highMem = $results | ? { $_.'Private Memory (GB)' -gt 1.6 }
    Write-Host $highMem
}

#out-file -filepath C:\Memory_Script\Results.txt -inputobject $mem -encoding ASCII -width 50

我的问题是:我需要保存从每个服务器获取的内存值。 从那里,我需要一些逻辑来确定内存是否超过1.6GB,并在文本文件的顶部显示一个服务器列表。

我该如何解决这个问题?

另一个问题,我从一些教程中复制了一些查询,为什么" e ="在这部分查询中?

e={$_.privatememorysize / 1gb}

感谢您的时间。

2 个答案:

答案 0 :(得分:2)

要回答第一个问题,最好有一个对象数组。您当前的命令返回具有各种属性的对象。要为多个服务器执行此操作,您只需将$results创建为数组并为每个服务器附加到它。

假设您以某种方式使用正确的列表填充$servers

$servers = Get-Content ".\list-of-servers.txt"
$results = @()

foreach($server in $servers) {
  $results += ,(get-process w3wp -computername $server | where-object {$_.privatememorysize -gt 1000000000} | select name, @{l="Private Memory (GB)"; e={$_.privatememorysize / 1gb}}) 
}

$highMem = $results | ? { $_.'Private Memory (GB)' -gt 1.6 }

$results包含所有服务器的列表,然后您可以如图所示过滤它以获取内存为> 1.6的进程。

要回答第二个问题,e={$_.privatememorysize / 1gb}是一种对对象属性进行计算并将其保存为新属性的方法。它通常用于使事物更具可读性,如您的情况所示。 l="Private Memory (GB)"用于为计算属性创建标签。

答案 1 :(得分:-1)

e是表达式的缩写。 l代表标签。