在Powershell中创建动态数组

时间:2017-01-25 16:24:23

标签: arrays powershell dynamic

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

我正在尝试从大量文本中读取EXIT STATUS代码(在一个名为$ MainArray的数组中保存)。

该文本出现了许多单词ERROR STATUS后跟一个数字,如:

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

一些EXIT STATUS后跟一个数字在文件中出现多次,需要删除双精度

我收集这些EXIT STATUS代码,并将它们放在一个数组中,删除双打(到目前为止没有问题),但我想从我找到的条目中创建新的ARRAY。

为此,我删除了空格并用_替换它们,因此数组包含:

...
EXIT_STATUS_0
EXIT_STATUS_123
EXIT_STATUS_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
...

但我不知道如何生成能够为我做的代码:(

我希望你能帮我解决这个问题......希望我的ramblings有意义;)

这就是我得到的:

...
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指示),这些行随机分散在生成某个EXIT STATUS的文本文件中(在此示例中为0)

EXIT STATUS 0仅为作业ID 1792278生成一次,我需要找到与此作业ID相关的所有行

1 个答案:

答案 0 :(得分:1)

使用动态名称创建变量是一个可怕的想法 - 您将如何跟踪它们?

在10个案例中的9个案例中,您最好使用Hashtable。

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

# 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中可用,您可以按状态代码访问您的数据:

$StatusTable['EXIT STATUS 0']