在 PowerShell 中使用比较对象,有没有办法根据替代条件进行比较输出?

Using the Compare-Object in PowerShell, is there a way to make a comparison output based on alternative conditions?

我正在编写一个脚本,用于将服务器配置与基准配置以及并行服务器进行比较。脚本将检查的设置包括软件版本、RAM 分配、目录位置和可用存储 space,等等。

我的计划是使用三个 XML 文件;一个用于基线,一个用于参考服务器,一个用于差异服务器。

问题是,并非每次对配置的检查都是为了平等。例如,已用存储基于总量的百分比 space、目录检查需要忽略某些字符等

解决这个问题的最佳方法是什么? XML 本身有没有办法让它动态化?有什么好的方法可以让我更改代码中的 XML 值吗?还有其他更好的角度我没有想到吗?

示例:

Baseline:
- 
- 
Port               - 1234  
Minimum Memory     - =< 75% of total RAM  
Default Data Dir   - E:\Data  

Server to check:
Total RAM          - 12
SQL Server Version - Microsoft SQL Server 2008
Port               - 1234
Minimum Memory     - 10
Default Data Dir   - E:\Directory\Data

Comparing server:
Total RAM          - 8
SQL Server Version - Microsoft SQL Server 2012
Port               - 1234
Minimum Memory     - 6
Default Data Dir   - E:\Data


Output:
Server to check:
Total RAM          - DIFF FROM COMPARING SERVER
SQL Server Version - DIFF FROM BASELINE
Port               - PASS
Minimum Memory     - DIFF FROM BASELINE
Default Data Dir   - DIFF FROM BASELINE
#can be taken from XML file
$freeMemoryPercentRequirement = 75

$referenceServer = [PSCustomObject]@{

    Name = "Server01"
    TotalMemory = 0
    FreeMemoryPercent = 0

}

$targetServer = [PSCustomObject]@{

    Name = "Server44"
    TotalMemory = 0
    FreeMemoryPercent = 0

}

$results = [PSCustomObject]@{

    Name = $targetServer.Name
    TotalMemory = ""
    FreeMemoryPercent = ""

}

foreach($server in $referenceServer,$targetServer) {
    $server.TotalMemory = (Get-WmiObject -computerName $server.Name -Class Win32_ComputerSystem).TotalPhysicalMemory / 1024
    $server.FreeMemoryPercent = "{0:N0}" -f ((Get-WmiObject -computerName $server.Name -Class Win32_OperatingSystem).FreePhysicalMemory / $server.TotalMemory * 100)
}

if($targetServer.TotalMemory -eq $referenceServer.TotalMemory) {
    $results.TotalMemory = "CHECK!"
} else {
    $results.TotalMemory = "FAILED"
}

if($targetServer.FreeMemoryPercent -ge $freeMemoryPercentRequirement ) {
    $results.FreeMemoryPercent = "CHECK!"
} else {
    $results.FreeMemoryPercent = "FAILED"
}

$results | fl *

示例输出:

Name              : Server44
TotalMemory       : CHECK!
FreeMemoryPercent : FAILED

我很匆忙,暂时无法添加评论,稍后我会尝试编辑。告诉我这是否符合您的需要^^。