在 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
我很匆忙,暂时无法添加评论,稍后我会尝试编辑。告诉我这是否符合您的需要^^。
我正在编写一个脚本,用于将服务器配置与基准配置以及并行服务器进行比较。脚本将检查的设置包括软件版本、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
我很匆忙,暂时无法添加评论,稍后我会尝试编辑。告诉我这是否符合您的需要^^。