Arrays 在Powershell中创建动态阵列

Arrays 在Powershell中创建动态阵列,arrays,powershell,dynamic,Arrays,Powershell,Dynamic,Powershell非常新,所以我希望这不是一个愚蠢的问题;) 我试图从大量文本中读取退出状态代码(保存在名为$MainArray的数组中) 文本中多次出现“错误状态”一词,后跟一个数字,如: 随机文本随机文本退出状态0随机文本随机文本 随机文本退出状态123随机文本随机文本 退出状态5随机文本随机文本随机文本 等等 一些后跟数字的退出状态在文件中多次出现,需要删除重复出现的状态 我收集这些退出状态代码,并将它们放入一个数组中,删除重复项(到目前为止没有问题),但我想从找到的条目中创建新的数组

Powershell非常新,所以我希望这不是一个愚蠢的问题;)

我试图从大量文本中读取退出状态代码(保存在名为$MainArray的数组中)

文本中多次出现“错误状态”一词,后跟一个数字,如:

随机文本随机文本退出状态0随机文本随机文本 随机文本退出状态123随机文本随机文本 退出状态5随机文本随机文本随机文本 等等

一些后跟数字的退出状态在文件中多次出现,需要删除重复出现的状态

我收集这些退出状态代码,并将它们放入一个数组中,删除重复项(到目前为止没有问题),但我想从找到的条目中创建新的数组

为此,我删除空格,并将其替换为u,因此数组包含:


退出\u状态\u 0
退出\u状态\u 123
退出\u状态\u 5
...

我希望执行的动态代码如下所示:

...
$EXIT_STATUS_0 = New-Object -TypeName System.Collections.ArrayList
$EXIT_STATUS_123 = New-Object -TypeName System.Collections.ArrayList
$EXIT_STATUS_5 = New-Object -TypeName System.Collections.ArrayList
...
但我不知道如何生成代码来为我做到这一点:(

我希望你能在这方面帮助我……希望我的闲话有意义;)

这就是我得到的:

...
While ($MainCounter -le $MainArray.count)
{
    $StringToMatch = 'EXIT STATUS (\d{1,4})'
    If ($MainArray[$MainCounter] -match $StringToMatch)
    {
        $FoundStatusCodeArray += $Matches[0]

        $ExitStatusArray += $MainArray[$MainCounter]    
        $ExitStatusCounter ++
    }
    $MainCounter ++
}

$FoundStatusCodeArray = $FoundStatusCodeArray|Select-Object -Unique

ForEach ($FoundStatus in $FoundStatusCodeArray)
{   
    $FoundStatus = $FoundStatus.Replace(" ", "_")

    #Create all empty arrays here from the array
    foreach (blah)
    {   
       ?????? = New-Object -TypeName System.Collections.ArrayList
    }

    #Code that fills the unknown number of generated arrays
    ?????

}
例如,文本文件的示例如下:

1485202557 1 65604 4 appxxx 1792308 1792246 0 appxxx nbpem CLIENT APPxxx  POLICY dc1_vm_prod_df_2100_media1  SCHED 01_df  EXIT STATUS 0 (the requested operation was successfully completed) VBRF 1 0
1485202564 1 4 4 appxxx 1792278 1792188 0 appxxx bptm successfully wrote backup id appxxx_1485202103, copy 1, fragment 2, 10616729 Kbytes at 513232.573 Kbytes/sec
1485202565 1 33412 4 appxxx 1792278 1792188 0 appxxx bptm StorageServer=PureDisk:appxxx; Report=PDDO Stats for (appxxx): scanned: 61853747 KB, CR sent: 547527 KB, CR sent over FC: 0 KB, dedup: 99.1%, cache disabled
1485202566 1 65604 4 appxxx 1792278 1792188 0 appxxx nbpem CLIENT appxxx  POLICY dc1_vm_ota_df_2100_media3  SCHED 01_df  EXIT STATUS 0 (the requested operation was successfully completed) VBRF 1 0
复杂的解释,但这是我的最终目标:

我需要找到属于某个作业(此处由进程ID 1792278指示)的所有行,这些行随机分散在生成特定退出状态(本例中为0)的文本文件中


对于作业id 1792278,退出状态0只生成一次,我需要找到与此作业id相关的所有行创建具有动态名称的变量是一个糟糕的主意-您将如何跟踪它们

在10种情况中,有9种情况下,最好使用哈希表

问题并不完全清楚您想要用什么填充这些动态生成的数组,但在下面,我将假设您想要将包含特定状态代码的所有行链接回该状态代码:

# Create an empty hashtable:
$StatusTable = @{}

# Pipe your array to `Select-String` and look for a pattern to match EXIT STATUS [number]
$MainArray |Select-String -Pattern '\bEXIT STATUS \d+\b' -AllMatches |ForEach-Object {
    foreach($StatusMatch in $_.Matches){
        # Check if a hashtable key already exist for the status code string
        if($StatusTable.ContainsKey($StatusMatch.Value)){
            # Already exists, add line to existing array
            $StatusTable[$StatusMatch.Value] += $_.Line
        } else {
            # Doesn't exist yet, create key by assigning 1-item array
            $StatusTable[$StatusMatch.Value] = @($_.Line)
        }
    }
}
$StatusTable['EXIT STATUS 0']
现在,您的所有数据都可以在哈希表
$StatusTable
中找到,您可以通过状态代码访问数据:

# Create an empty hashtable:
$StatusTable = @{}

# Pipe your array to `Select-String` and look for a pattern to match EXIT STATUS [number]
$MainArray |Select-String -Pattern '\bEXIT STATUS \d+\b' -AllMatches |ForEach-Object {
    foreach($StatusMatch in $_.Matches){
        # Check if a hashtable key already exist for the status code string
        if($StatusTable.ContainsKey($StatusMatch.Value)){
            # Already exists, add line to existing array
            $StatusTable[$StatusMatch.Value] += $_.Line
        } else {
            # Doesn't exist yet, create key by assigning 1-item array
            $StatusTable[$StatusMatch.Value] = @($_.Line)
        }
    }
}
$StatusTable['EXIT STATUS 0']

等待您有一个包含多个错误代码的文本。你想用它们做什么?我的意思是,您想要实现什么?您的
$MainArray
源中的数据来自哪里?不要在代码中戳洞,但这似乎是解析来自另一个进程的代码的一种困难方法……为什么要将这些代码放入数组中?您是否试图根据ExitStatus对前面的文本进行分组?文本从Linux服务器中提取(Powershell从我的工作站执行)。我的最终目标(解释起来很复杂,对不起!)是多次解析文本,收集与状态代码相关的行。文本的一个示例刚刚添加到原始文章中,并附带了一些额外的信息。@Fredster,从您从Linux服务器输入的内容的声音来看,其格式就像一个大字符串。首先,我会尝试在换行符上拆分文本(因为Linux标准是将换行符用于新的换行符,而不是Windows标准,后者是回车符,然后换行符),以便将它们分成单独的行,并从那里开始工作。这可以通过ForEach对象脚本来实现,该脚本在字符串数组中循环并解析您提到的退出状态代码。明天我会回来回答这个问题。嗨,马西亚斯,哇,这真的帮了我很大的忙!我从没想过用哈希表代替数组。。。这正是我需要继续做的!谢谢