Search code examples
powershellforeachpowershell-4.0

Generate 2 different list in one foreach loop with powershell


I stucked in foreach part.I couldn't find any solution for generating 2 different lists in one foreach loop.I used 2 foreach but it didn't help.Below side I shared my desire output.

My code:

$InStuff = @'
a
b
c
'@.Split("`n").Trim()

$InStuff2 = @'
1
2
3
'@.Split("`n").Trim()

$SPart_1 = 'application="'
$SPart_2 = ' path='
$SPart_3 = ' name='
$SPart_4 = ' application'

foreach ($IS_Item in $InStuff) {
    foreach ($IS2_Item in $InStuff2) {    
        $UName = $IS_Item 

        $UName2 = $IS2_Item

        $Sentence = -join (
            $SPart_1, $UName,
            $SPart_2, $UName2,
            $SPart_3, $UName2,
            $SPart_4
        )
        ''
        $Sentence
    }
}

Fail output :

application="a path=1 name=1 application

application="a path=2 name=2 application

application="a path=3 name=3 application

application="b path=1 name=1 application

application="b path=2 name=2 application

application="b path=3 name=3 application

application="c path=1 name=1 application

application="c path=2 name=2 application

application="c path=3 name=3 application

My desire output :

application="a path=1 name=1 application

application="b path=2 name=2 application

application="c path=3 name=3 application

Thank you


Solution

  • use a for loop:

    $InStuff = @'
    a
    b
    c
    '@.Split("`n").Trim()
    
    $InStuff2 = @'
    1
    2
    3
    '@.Split("`n").Trim()
    
    $SPart_1 = 'application="'
    $SPart_2 = ' path='
    $SPart_3 = ' name='
    $SPart_4 = ' application'
    
    for ($i = 0; $i -lt $InStuff.count; $i++) {
            $Sentence = -join (
                $SPart_1, $InStuff[$i],
                $SPart_2, $InStuff2[$i],
                $SPart_3, $InStuff2[$i],
                $SPart_4
            ), ''
            $Sentence
    }
    

    This will likely go wrong if your input arrays are not the same length, so it is not that safe. Perhaps using a hash or custom object would be a better idea:

    $arr = @()
    $arr += new-object PSCustomObject -property @{application='a';path=1;name=1}
    $arr += new-object PSCustomObject -property @{application='b';path=2;name=2}
    $arr += new-object PSCustomObject -property @{application='c';path=3;name=3}
    
    $arr | % { 'application="{0} path={1} name={2}' -f $_.application, $_.path, $_.name }