为什么Get-CimInstance每次都输出相同的值?

时间:2019-08-21 17:29:56

标签: powershell

假设我有一个这样的表

DBName  pserver      qserver
cube1   server1.com q1server.com    
cube1   server2.com q2server.com    
cube2   server3.com q3server.com    
cube2   server4.com q4server.com  

我有以下代码

param([float]$Threshold)

Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection 
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI" 
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand 
$SqlCmd.Connection = $SqlConnection 
$SqlCmd.CommandText = $Query 
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter 
$SqlAdapter.SelectCommand = $SqlCmd 
$DataSet = New-Object System.Data.DataSet 
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close() 
$DataSet.Tables[0] }

$PServers = Query "SELECT DISTINCT [pserver] FROM [dbo].[$Table]" | Select -ExpandProperty pserver;
$QServers = Query "SELECT DISTINCT [qserver] FROM [dbo].[$Table]" | Select -ExpandProperty qserver;

foreach($server in $PServers + $QServers)
{ 
    if(!$Threshold) 
    {
        [float]$Threshold = 0.00
        $cs = New-CimSession -ComputerName $server
        [float]$Threshold = ((Get-CimInstance Win32_PhysicalMemory -CimSession $cs | Measure-Object -Property capacity -Sum).sum /1gb)*0.7 

    }

    "$server: $Threshold"
} 

在q1server.com上,有200 GB的内存,而其余服务器有96GB的内存。

如果我在q1server.com服务器上的Powershell上运行阈值Cim代码,我将获得140GB的存储空间,这是正确的,因为0.7乘法

所以我知道阈值代码很好并且可以正常工作。

但是,for循环中的阈值似乎总是导致67.20

67.20是来自其他服务器的96GB的结果,这也仅对其他服务器正确。那么为什么它要覆盖q1server 140 GB阈值而仅输出67.2GB?

enter image description here

应该是这样的

67.2
67.2
67.2
67.2
140
67.2
67.2
67.2

1 个答案:

答案 0 :(得分:2)

发生逻辑错误,您有一个if条件来检查是否没有$threshold仅对首次迭代有效的{{1}}。您可以删除该支票,因为它不是必需的。