2

Citrix QFarm /load コマンドをテキスト ファイルに出力するスクリプトを実行しています。基本的には、次のように多次元配列に入力する 2 つの列です。

SERVER1 100
SERVER2 200
SERVER3 300

特定のサーバーの indexOf を探しているので、ロードバランサーのレベルを確認できます。indexOf メソッドを使用すると、-1 しか返されません。しかし、スクリプトの最後の明示的な write-host は、答えが 41 として返されることを示しています。

2次元配列でIndexOfを使用するために必要な魔法はありますか?

$arrQFarm= @()
$reader = [System.IO.File]::OpenText("B:\WorkWith.log")
try {
for(;;) {
    $str1 = $reader.ReadLine()
    if ($str1 -eq $null) { break }

    $strHostname = $str1.SubString(0,21)
    $strHostname = $strHostname.TrimEnd()
    $strLB = $str1.SubString(22)
    $strLB = $strLB.TrimEnd()

    $arrQFarm += , ($strHostName , $strLB)
    }
}
finally {
$reader.Close()
}

$arrCheckProdAppServers = "CTXPRODAPP1","CTXPRODAPP2"


foreach ($lines in $arrCheckProdAppServers){
$index = [array]::IndexOf($arrQFarm, $lines)
Write-host "Index is" $index
Write-Host "Lines is" $lines

}

if ($arrQFarm[41][0] -eq "CTXPRODAPP1"){
Write-Host "YES!"
}

これを実行すると、次の出力が得られます。

PS B:\Citrix Health Monitoring\249PM.ps1
Index is -1
Lines is CTXPRODAPP1
Index is -1
Lines is CTXPRODAPP2
YES!
4

1 に答える 1

1

あなたの場合、両方の列が次のように(hostname | level)一致する場合にのみ機能すると思います[array]::IndexOf($arrQFarm, ($strHostName , $strLB))IndexOfによると、配列のアイテム全体(この場合は配列でもあります)を比較します

質問に直接答えないかもしれませんが、Hashtableを使用するのはどうですか(修正のためのdugasに感謝します)?お気に入り:

$arrQFarm= @{}
$content = Get-Content "B:\WorkWith.log"
foreach ($line in $content)
{
    if ($line -match "(?<hostname>.+)\s(?<level>\d+)")
    {
        $arrQFarm.Add($matches["hostname"], $matches["level"])
    }
}

$arrCheckProdAppServers = "CTXPRODAPP1","CTXPRODAPP2"

foreach ($lines in $arrCheckProdAppServers)
{
    Write-host ("Loadbalancer level is: {0}" -f $arrQFarm[$lines])
}
于 2013-03-19T20:10:13.947 に答える