首页 > 解决方案 > 从 powershell 数组求和时如何包含某些值?

问题描述

我想得到一个 SQL 服务器用于数据和日志文件的总空间的总和。从互联网上的其他几个来源,我有以下代码:(是的,我是 Powershell Noob)

$servers = "SQLSERVER1"
$array = @()
foreach($server in $servers){
    $sysinfo =  Get-WmiObject Win32_Volume -ComputerName $server
    for($i = 0;$i -lt $sysinfo.Count; $i++){
        $sname =  $sysinfo[$i].SystemName
        $servername = $server
        $label = $sysinfo[$i].Label
        if(($label) -and (!($label.Contains("FILLER")))){
            write-host "Processing $label from $server"
            $name = $sysinfo[$i].Name
            $capacity = [math]::round(($sysinfo[$i].Capacity/1GB),2)
            $fspace = [math]::round(($sysinfo[$i].FreeSpace/1GB),2)
            $sused = [math]::round((($sysinfo[$i].Capacity - $sysinfo[$i].FreeSpace)/1GB),2)
            $fspacepercent =  [math]::Round((($sysinfo[$i].FreeSpace*100)/$sysinfo[$i].Capacity),2)
            $obj = New-Object PSObject
            $obj | Add-Member -MemberType NoteProperty -Name "ServerName" -Value $server
            $obj | Add-Member -MemberType NoteProperty -Name "Label" -Value $label
            $obj | Add-Member -MemberType NoteProperty -Name "Name" -Value $name
            $obj | Add-Member -MemberType NoteProperty -Name "Used(GB)" -Value $sused
            $array += $obj
        }
    }
    $array += write-output " "
    $totalSize = ($array | Measure-Object 'Used(GB)' -Sum).Sum
    $array += $totalsize
    $array += write-output " "
}
$totalsize

这给了我以下结果:

Processing Recovery from SQL-Group1-DB
Processing System from SQL-Group1-DB
Processing SQLInstall from SQL-Group1-DB
Processing OCTOPUS from SQL-Group1-DB
Processing SQL_DATA from SQL-Group1-DB
Processing SQL_LOG from SQL-Group1-DB
Processing TEMP_DB from SQL-Group1-DB
Processing SSS_X64FREV_EN-US_DV9 from SQL-Group1-DB
274.92

当然,这包括服务器上的每个驱动器。我只希望包含 SQL_DATA 和 SQL_LOG 驱动器。

关于如何实现这一目标的任何想法?(如果可行,很高兴使用完全不同的代码)TIA

标签: powershellsum

解决方案


如果您不想要服务器上所有驱动器的信息,您可以通过使用如下子句来限制变量中Get-WmiObjectcmdlet的结果:$sysinfoWhere-Object{}

$sysinfo = Get-WmiObject Win32_Volume -ComputerName $server | 
           Where-Object { 'SQL_DATA', 'SQL_LOG' -contains $_.Label }

推荐阅读