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

时间:2015-12-04 16:21:30

标签: xml powershell comparison

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

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

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

对我来说,解决这个问题的最佳途径是什么? 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

1 个答案:

答案 0 :(得分:0)

#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

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