1

次のようなファイルがあります

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を含むすべての行を含める必要がありますAP1AppPoolsが含まれている場合はboが必要AP2であり、明らかに両方が含まれている場合は両方の行が必要です。

サーバーinstancesに含まれる場合、 ORCom2を含むすべての行を含める必要があります。線になります。com2com4newCom3thirdFolder

現在、次のようなifステートメントがいくつかあります

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

問題は、私がこれを行っている方法が最善の方法ではない、またはこれをどのように行うべきかについて、私がほぼ肯定的であるということです。この検証を実行する最良の方法について、誰かが洞察を提供できますか?

4

1 に答える 1

2

$refinedResultsあなたのアプローチで私が目にする主な問題は、コレクションに重複が生じる可能性があるという事実です。

これを回避するにはHashSet、文字列の a を使用できます。
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)
}

$refinedResults のインスタンス化が失敗した場合は、以下を追加します。

Add-Type -AssemblyName System.Core

その前にあなたのスクリプトに

于 2013-08-27T16:00:49.933 に答える