纠正多个标志的条件逻辑

时间:2013-08-27 15:33:34

标签: validation powershell

我有一个类似于以下内容的文件

C:\path\AP1\com1\web.config
C:\path\AP2\com1\web.config
C:\path\AP1\com2\web.config
C:\path\AP2\com2\web.config
C:\path\AP1\com4new\web.config
C:\path\AP2\com4new\web.config
C:\path\AP1\thirdFolder\web.config
C:\path\AP2\thirdFolder\web.config

无论环境如何,此文件都会在每台服务器上输出。我正在创建一个验证脚本,只包含每个服务器的相关行。

服务器数据的示例是这个

<server compName="serverName102">
    <ip>192.168.1.1</ip>
    <type>App</type>
    <env>test</env>
    <instances>Com2, Com3</instances>
    <AppPools>bo, fo</AppPools>
</server>

如果服务器的AppPools设置包含fo,那么我需要包含包含AP1的所有行。如果AppPools包含bo,那么我需要AP2,显然如果它包含两者,我需要两行。

如果服务器的instances包含Com2,那么我需要包含包含com2com4new的所有行。 Com3将成为thirdFolder行。

我目前有几个if语句如下所示

if ($serverInst -like "*com2*"){
    $refinedResults += $allResults | where-object {$_ -like "*com2*" -or $_ -like "*com4new*"}
}

问题在于,我几乎是肯定的,我这样做是不是最好的方式,或者我应该怎么做。任何人都可以提供一些有关执行此验证的最佳方法的见解吗?

1 个答案:

答案 0 :(得分:2)

我看到您的方法遇到的主要问题是,您的$refinedResults集合中最终可能会出现重复项。

要解决此问题,您可以使用HashSet个字符串 如果您尝试将值添加到HashSet并且它已经存在,则该操作只返回false并且Set没有任何反应。

假设$allResults是一个字符串数组,您可以这样做:

$refinedResults = New-Object System.Collections.Generic.HashSet[String]

if ($serverInst -like "*com2*")
{
    $refinedResults.UnionWith([String[]]($allResults |? {$_ -like "*com2*" -or $_ -like "*com4new*"}))
}

为了便于阅读(如果您计划一次处理多个条目,则可以提高性能),您可能需要在开始匹配之前定义规则并从$allResults中提取:

[String[]]$resultsCom2 = $allResults |? {$_ -like "*com2*" -or $_ -like "*com4new*"}
[String[]]$resultsCom3 = $allResults |? {$_ -like "*thirdfolder*"}

$refinedResults = New-Object System.Collections.Generic.HashSet[String]

if ($serverInst -like "*com2*")
{
    $refinedResults.UnionWith($resultsCom2)
}

if ($serverInst -like "*com3*")
{
    $refinedResults.UnionWith($resultsCom3)
}

如果$ refineResults的实例化失败,请添加:

Add-Type -AssemblyName System.Core

之前的脚本