这是我第一次使用 Powershell,我需要一些关于查询的帮助。
我需要远程连接到公共(public)域上的一些服务器并从每个服务器中提取内存消耗,然后将它们显示到文本文件中。所有这些都适用于这个查询:
$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}
感谢您的时间。
最佳答案
要回答您的第一个问题,最好有一个对象数组。您当前的命令返回一个具有各种属性的对象。要为多台服务器执行此操作,您只需创建 $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)"
用于为计算的属性创建标签。
关于Powershell - 从管道中提取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31880311/