生成2个不同的列表在一个foreach循环与powershell

问题描述:

我在foreach部分stucked。我找不到任何解决方案在一个foreach循环中生成2个不同的列表。我使用了2 foreach但它并没有帮助。分享了我的愿望输出。生成2个不同的列表在一个foreach循环与powershell

我的代码:

$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

+0

ty brendan;)欣赏它 –