PowerShell:同时从多个数组返回数据

时间:2014-02-13 09:13:45

标签: arrays powershell

好吧,伙计们。另一个我不完全确定是可能的。我环顾四周,没有看到任何有效的东西(或者如果我有,我没有意识到)。

基本上,我有两个阵列......

$x = @(a,d,b,c)

$y = @(alice,bob,chuck,dave)

...前者是预先填充的,后者是由用户输入生成的;它们的长度总是相同的。

我想基本上做foreach ($x in $x) {echo "$x is assigned to $y")

结果如下:

  

a被分配给alice

     

d被分配给bob

     

b被分配给chuck

     

c被分配给dave

问题在于,如果可能的话,我不知道如何去做。虽然我的脚本不是100%必需的,但它会大大缩短我必须编写的内容,并允许扩展脚本的参数。

提前致谢。

编辑: 选择的答案已被选中,因为虽然其他答案大致相同,但它更易读,使用起来更舒服

3 个答案:

答案 0 :(得分:0)

使用普通的for循环代替foreach,如此,

$x = @('a','d','b','c')
$y = @('alice','bob','chuck','dave')

if($x.Length -ne $y.Length) { 
    # TODO: What to do if user input is missing assignees?
} else {
    for($i=0;$i -ne $x.Length; ++$i) { "{0} -> {1}" -f $x[$i], $y[$i] }
}

Output
a -> alice
d -> bob
b -> chuck
c -> dave

答案 1 :(得分:0)

在一行代码中有两种方法可以做到这一点。 所以考虑一下你的代码:

$x = @("a","d","b","c");
$y = @("alice","bob","chuck","dave");

如果$ x中的项目都是不同的,则此方法有效:

$x | ForEach-Object { "$_ is assigned to $($y[$x.IndexOf($_)])" };

您还可以将ForEach-Object缩短为百分之一。他们的意思相同:

$x | % { "$_ is assigned to $($y[$x.IndexOf($_)])" };

如果您的项目不明显(或者您只是想避免无理由索引),则可以添加另一个块来初始化索引器变量,如下所示:

$x | % { $i = 0 } { "$_ is assigned to $($y[$i])"; ++$i };

认为这个主题很有意思,所以也放了一个帖子:

https://tangodude.wordpress.com/2014/02/13/powershell-different-ways-of-looping-indexing/

答案 2 :(得分:0)

最短的我能得到它是:

$i = 0; $x | % { "$_ is assigned to $($y[$i++])"}