我刚刚发现了 Powershell 工作流,并且正在尝试,但遇到了一些困难。我不知道工作流是否具有执行以下操作的能力,但如果它们具有,我将非常感谢指导以使以下功能正常工作。
简而言之,我的函数workflow ProcessFrame
(希望)设计为接受一个数组数组,查看数组第二维内的两个字段,如果第二维数组中的一个数组中的配对值与条件参数匹配,则将其他第二维数组中的某些值返回到函数返回的新数组中。好吧,我意识到这个描述可能会让您头疼,所以让我用脚本创建一个示例。
顺便说一句,我知道如何使用传统foreach
循环来做到这一点,但如果可能的话,我想利用foreach -parallel
Powershell 工作流的功能来学习一项新技能。
请注意,每当我提到数组的“第二”或“第三”字段时,我都是从零开始的。因此,最左边的字段我会称为“零”字段。因此,数组 (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)"
}
}
}