使用 powershell 在一个 foreach 循环中生成 2 个不同的列表

Generate 2 different list in one foreach loop with powershell

我卡在 foreach part.I 找不到任何在一个 foreach 中生成 2 个不同列表的解决方案 loop.I 使用了 2 个 foreach 但它没有 help.Below 我分享了我的想要输出。

我的代码:

$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
    }
}

失败输出:

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

我的愿望输出:

application="a path=1 name=1 application

application="b path=2 name=2 application

application="c path=3 name=3 application

谢谢

使用 for 循环:

$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
}

如果您的输入数组长度不同,这很可能会出错,因此不太安全。也许使用散列或自定义对象会更好:

$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 }

@arco444 是对的,如果你的列表长度不同,不管你有什么问题。您应该重新考虑如何收集和格式化数据。这是另一种方法:

$InStuff = "a","b","c"
$InStuff2 = 1,2,3
$listCount = $InStuff.Count
$x = 0
do {
    $strOut = "application= `"path = {0} name = {1} application`"" -f $InStuff[$x], $InStuff2[$x]
    $strOut
    $x++
}
while ( $x -lt $listCount )

不确定你想要什么,里面有一个杂散的 ",我添加了一个来封装输出:

application= "path = a name = 1 application"
application= "path = b name = 2 application"
application= "path = c name = 3 application"

如果您计划使用此输出由 PowerShell 进行进一步处理,例如将其放入带有 Export-Csv 的 csv 中,那么您应该放弃 application 文本并创建一个对象:

$InStuff = "a","b","c"
$InStuff2 = 1,2,3
$listCount = $InStuff.Count
$x = 0

do {
    [pscustomobject]@{
        path = $InStuff[$x]
        name = $InStuff2[$x]
    }
    $x++
}
while ( $x -lt $listCount )

虽然这并不完全符合您的要求,但根据我的经验,这种格式的数据更有用:

path name
---- ----
a       1
b       2
c       3

你可以添加行到

    [pscustomobject]@{
        path = $InStuff[$x]
        name = $InStuff2[$x]
    }

对于附加文本(如果必须的话)并执行如下操作:

    [pscustomobject]@{
        type = "application"
        path = $InStuff[$x]
        name = $InStuff2[$x]
    }

这将为单词 application

添加一列