代码之家  ›  专栏  ›  技术社区  ›  Matthew Pigram

Powershell二维阵列未按预期工作

  •  0
  • Matthew Pigram  · 技术社区  · 11 年前

    目前,我正在从XML文件加载一些数据,以配置脚本运行的一些参数,但是 $keywords $maxCounts 发送到 CheckForKeywords 作用

    function Main()
    {
    
    #### VARIABLES RELATING TO THE LOG FILE
    
    #contains the log path and log file mask
    $logPaths = @()
    $logFileMasks = @()
    
    # key value pair for the strings to match and the max count of matches before they are considered an issue
    $keywords = @(,@())
    $maxCounts = @(,@())
    
    
    #### FUNCTION CALLS
    
    LoadLogTailerConfig $logConfigPath ([ref]$logPaths) ([ref]$logFileMasks) ([ref]$keywords) ([ref]$maxCounts)
    
    for ($i = 0; $i -lt $logPaths.Count; $i++)
    {
        $tail = GetLogTail $numLinesToTail $logPaths[$i] $logFileMasks[$i]
    
        $tailIssueTable = CheckForKeywords $tail $keywords[$i] $maxCounts[$i]
    
    
    }
    
    }
    
    # Loads in configuration data for the utility to use
    function LoadLogTailerConfig($logConfigPath, [ref]$logPaths, [ref]$logFileMasks, [ref]$keywords, [ref]$maxCounts)
    {
        Write-Debug "Loading config file data from $logConfigPath"
    
        [xml]$configData = Get-Content "C:\Testing\Configuration\config.xml"
    
        foreach ($log in $configData.Logs.Log) {
    
            $logPaths.Value += $log.FilePath
            $logFileMasks.Value += $log.FileMask
    
            $kwp = @()
            $kwc = @()
    
            foreach ($keywordSet in $log.Keywords.Keyword)
            {
                $kwp += $keywordSet.Pattern
                $kwc += $keywordSet.MaxMatches 
            }
    
            $keywords.Value += $kwp
            $maxCounts.Value += $kwc
        }
    }
    
    # Returns body text for email containing details on keywords in the log file and their frequency
    function CheckForKeywords($tail, $keywords, $maxCounts)
    {   
        $issuesFound = 0
    
    
        for ($i = 0; $i -lt $keywords.Count; $i++)
        {
            $keywordCount = ($tail | Select-String $keywords[$i] -AllMatches).Matches.Count
    
            Write-Debug $keywords.Count
    
            Write-Debug (("Match count for {0} : {1}" -f $keywords[$i], $keywordCount))
    
            if ($keywordCount -gt $maxCounts)
            {
                #do stuff
            }
        }
    
        return ""
    }
    
    Main
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Andrew Savinykh    11 年前

    您所做的不是二维数组,而是嵌套数组。通过写作

    $keywords = @(,@())
    $maxCounts = @(,@())
    

    您正在创建一个包含一个元素的数组。此元素是一个包含零元素的数组。你不需要这个。因此,将上述更改为:

    $keywords = @()
    $maxCounts = @()
    

    现在,当您这样做时:

    $keywords.Value += $kwp
    $maxCounts.Value += $kwc
    

    powershell将右侧的数组展开,并将左侧的数组逐个元素合并。这不是你想要的。所以将此更改为

    $keywords.Value += @(,$kwp)
    $maxCounts.Value += @(,$kwc)
    

    另一方面,在powershell中使用by-ref参数是不习惯的,而且这种方法也不容易获得帮助。我建议更改您的函数以通过管道、powershell的方式传递结果,将来支持您脚本的人会很感激。您可以对不同类型的值进行建模,这些值将作为对象的属性返回,然后返回该对象。祝你好运

    推荐文章