Powershell 工作流 foreach -parallel (){} 函数指南

Powershell 工作流 foreach -parallel (){} 函数指南

我刚刚发现了 Powershell 工作流,并且正在尝试,但遇到了一些困难。我不知道工作流是否具有执行以下操作的能力,但如果它们具有,我将非常感谢指导以使以下功能正常工作。

简而言之,我的函数workflow ProcessFrame(希望)设计为接受一个数组数组,查看数组第二维内的两个字段,如果第二维数组中的一个数组中的配对值与条件参数匹配,则将其他第二维数组中的某些值返回到函数返回的新数组中。好吧,我意识到这个描述可能会让您头疼,所以让我用脚本创建一个示例。

顺便说一句,我知道如何使用传统foreach循环来做到这一点,但如果可能的话,我想利用foreach -parallelPowershell 工作流的功能来学习一项新技能。

请注意,每当我提到数组的“第二”或“第三”字段时,我都是从零开始的。因此,最左边的字段我会称为“零”字段。因此,数组 (1,2,3) 将被引用为字段零、一和二。我只是想避免任何混淆。

我们假设数组或数组填充如下(作为变量 $inputArray):

$inputArray[0]:(1,1,FRAME,BEGIN,1)
$inputArray[1]:(1,2,media_type,video,2)
$inputArray[2]:(1,2,pkt_pts,1234,3)
$inputArray[3]:(1,2,pict_type,P,4)
$inputArray[4]:(1,1,key_frame,0,5)

我希望以下脚本处理 $inputArray 中的所有第二维数组,并在满足条件时返回关键数据。具体来说,它应该首先确定单个第二维数组(在此示例中)中的media_type,video字段中是否存在匹配的对。如果不存在,则返回一个填充了三个字段的一维数组。如果匹配的对存在(如本示例中所示),则它应该返回一个包含其他数组数据的一维数组。$inputArray[][2],$inputArray[][3]$inputArray[1][2],$inputArray[1][3]$returnArray=@(0,0,0)$inputArray[1][2],$inputArray[1][3]

具体来说,它应该在第二维字段 中找到包含pict_type和的第二维数组。然后它应该在字段 中提取相同第二维数组的匹配值。然后它应该用 的相应值填充 $returnArray 。请不要担心 的第一个返回字段,因为第二维数组的第一个字段中的值都将相同;它只是被传递给。key_frame$inputArray[][2]$inputArray[][3]$returnArray=@($inputArray[0][0],<value of pict_type>$inputArray[3][3],<value of _key_frame>$inputArray[4][3])$inputArray[0][0]$inputArray[][0]$returnArray

假设这可以通过工作流和 实现foreach -parallel,我被难住了,不知道如何告诉函数确定第二维数组中的任何一个是否分别media_type,video在其第二和第三字段中匹配并满足if-then条件。一旦我弄清楚如何在循环中做到这一点foreach -parallel,我将继续研究如何根据该信息采取行动。具体来说,如果它们不满足条件if-then,则返回一个(0,0,0)数组;否则,继续处理第二维数组,在第二个字段中查找关键字,如果找到,则返回给定第二维数组中第三个字段的值。

所以,这是我的骨架结构。我尝试了各种各样的方法,但都无法获得理想的结果。谢谢你的帮助。

workflow ProcessFrame
{
    [CmdletBinding()]
    param (
        # The input will be an array of arrays where the first dimension is of variable length (20-45) and the second dimension each have 5 fields.
        # Example (with only two first dimensions - that is, 2 arrays of arrays):
        # $frameArray[0]:@(int32,int32,string,string,int32)
        # $frameArray[1]:@(int32,int32,string,string,int32)
        $inputArray
    )

    foreach -parallel ($i in $inputArray)
    { 
        # Determine if any single second dimension array $inputArray[][2],$inputArray[][3] matches "media_type,video".
        # If not exit function with return array of (0,0,0)
        if ($i[2] -eq "media_type" -and $i[3] -ne "video")
        {
            # the following may now work; it is a placeholder until I know the correct commands.
            Write-Output @(0,0,0)
        }
        # Determine if any single second dimension array $inputArray[][2],$inputArray[][3] matches "media_type,video".
        # If yes, extract key data from specific second dimension arrays and return values
        else
        {
            if ($i[2] -eq "pict_type")
            {
                $pictType=$inputArray[<corresponding array>][3]
            }
            if ($i[2] -eq "key_frame")
            {
                $keyFrame=$inputArray[<corresponding array>][3]
            }

            # the following may now work; it is a placeholder until I know the correct commands.
            Write-Output "$($inputArray[0][0]),$pictType,$keyFrame)"          
        }
    }
}

相关内容