我有一个类似于以下内容的文件
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
,那么我需要包含包含com2
或com4new
的所有行。 Com3
将成为thirdFolder
行。
我目前有几个if语句如下所示
if ($serverInst -like "*com2*"){
$refinedResults += $allResults | where-object {$_ -like "*com2*" -or $_ -like "*com4new*"}
}
问题在于,我几乎是肯定的,我这样做是不是最好的方式,或者我应该怎么做。任何人都可以提供一些有关执行此验证的最佳方法的见解吗?
答案 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
之前的脚本