I simply found Powershell workflows and I’m experimenting however having some difficulties. I have no idea if workflows even have the capabilities to do the next but when they do, I’d recognize steering to make the next perform work.
Briefly, my perform workflow ProcessFrame
is (hopefully) designed to accepted an array of arrays, take a look at two fields throughout the second dimension of the array and if the paired values inside one of many second dimension array matches the conditional parameters, return sure values from different second dimension arrays to a brand new array that the perform returns. Okay, I understand this description could have given you a headache so let me create and instance with the script.
BTW, I understand how to do that with a conventional foreach
loop but when attainable, I need to make the most of the foreach -parallel
capabilities of Powershell workflow to be taught a brand new ability.
Word, at any time when I’m referring to the “second” or “third” discipline of an array, I’m beginning at zero. So, the left-most discipline I’d name discipline “zero.” So, an array of (1,2,3) could be referenced as fields zero, one, and two. I simply need to keep away from any confusion.
Let’s assume the array or arrays is populated as follows (as variable $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)
What I would like the next script to do is course of all of the second dimension arrays inside $inputArray and return key information if situations are met. Particularly, it ought to first decide if there exists the matched pair of media_type,video
within the fields $inputArray[][2],$inputArray[][3]
in a single second dimension array (on this instance $inputArray[1][2],$inputArray[1][3]
). If not, return a single dimension array with three fields populated $returnArray=@(0,0,0)
. If the matched pair exists – because it does on this instance in $inputArray[1][2],$inputArray[1][3]
– then it ought to return a single dimension array with information from different arrays.
Particularly, it ought to discover the second dimension arrays that include pict_type
and key_frame
within the second dimension discipline $inputArray[][2]
. It ought to then extract the matched values of the identical second dimension array in discipline $inputArray[][3]
. It ought to then populate the $returnArray with the corresponding values of $returnArray=@($inputArray[0][0],<worth of pict_type>$inputArray[3][3],<worth of _key_frame>$inputArray[4][3])
. Please don’t worry concerning the first return discipline of $inputArray[0][0]
as the worth within the first discipline of the second dimension arrays – $inputArray[][0]
will all be the identical; it’s merely being handed by means of to the $returnArray
.
Assuming that is attainable with workflow and foreach -parallel
, I’m caught at determining easy methods to inform the perform to find out if any of the second dimension arrays have matched media_type,video
of their second and third fields respectively meet the if-then
situation. As soon as I determine how to try this in a foreach -parallel
loop, I’ll transfer on easy methods to act on that data. Particularly, If they do not meet the if-then
situation, return a (0,0,0)
array; in any other case, persevering with processing the second dimension arrays searching for key phrases within the second discipline and when discovered, return the worth of the third discipline inside that given second dimension array.
So, right here is the skeleton construction I’ve. I’ve tried a wide range of issues however cannot get anyplace near desired outcomes. Thanks on your assist.
workflow ProcessFrame
{
[CmdletBinding()]
param (
# The enter might be an array of arrays the place the primary dimension is of variable size (20-45) and the second dimension every have 5 fields.
# Instance (with solely two first dimensions - that's, 2 arrays of arrays):
# $frameArray[0]:@(int32,int32,string,string,int32)
# $frameArray[1]:@(int32,int32,string,string,int32)
$inputArray
)
foreach -parallel ($i in $inputArray)
{
# Decide if any single second dimension array $inputArray[][2],$inputArray[][3] matches "media_type,video".
# If not exit perform with return array of (0,0,0)
if ($i[2] -eq "media_type" -and $i[3] -ne "video")
{
# the next could now work; it's a placeholder till I do know the proper instructions.
Write-Output @(0,0,0)
}
# Decide if any single second dimension array $inputArray[][2],$inputArray[][3] matches "media_type,video".
# If sure, extract key information from particular 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 next could now work; it's a placeholder till I do know the proper instructions.
Write-Output "$($inputArray[0][0]),$pictType,$keyFrame)"
}
}
}