powershell
  • foreach
  • powershell-v4.0
  • 2017-10-20 102 views 0 likes 
    0

    我在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 
    

    謝謝

    回答

    0

    使用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 } 
    
    0

    @ 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;)欣賞它 –

    相關問題