2015-09-06 24 views
1

我想更新與一個數組循環這樣PowerShell如何管線FOR循環

$comps = Get-ChildItem $LocalPath -recurse | Select-String -pattern "MyStringFilter" | group path | select name | Foreach {"$($_.Name)".substring(0,"$($_.Name)".IndexOf('.')).substring("$($_.Name)".LastIndexOf('\')+1) } 
for ($i = 0; $i -lt $comps.count; $i++) { 
    if ($comps[$i].substring(0,3) -eq "AAA") {$comps[$i] = "/aaa "+$comps[$i]} else {$comps[$i] = "/bbb "+$comps[$i]} 
} 
$comps 

上面的代碼工作正常,但是當我試圖把它做成及如何使用foreach管道數組變量變空。

$comps = Get-ChildItem $LocalPath -recurse | Select-String -pattern "MyStringFilter" | group path | select name | Foreach {$_.Name.substring(0,$_.Name.IndexOf('.')).substring($_.Name.LastIndexOf('\')+1) } | foreach { if ($_.substring(0,3) -eq "AAA") {$_ = "/aaa "+$_} else {$_ = "/bbb "+$_} } 

我錯過了什麼?任何方式使它工作?

感謝,

+1

'{「/ aaa」+ $ _} else {「/ bbb」+ $ _}' – PetSerAl

回答

2

您不能分配到迭代值$_ForEach-Object的塊中:

$comps = Get-ChildItem $LocalPath -recurse | Select-String -pattern "MyStringFilter" | group path | select name | Foreach { 
    $_.Name.substring(0,$_.Name.IndexOf('.')).substring($_.Name.LastIndexOf('\')+1) 
} | foreach { 
    if ($_.substring(0,3) -eq "AAA") { 
     "/aaa "+$_ 
    } else { 
     "/bbb "+$_ 
    } 
} 

相反,如上面做,讓你想分配爲返回值的值的塊。每次迭代的所有返回組成一個數組,當您執行$comps =時,分配會在該語句的開始處發生。

+0

感謝您的解釋。欣賞它。 – Shawn