管道中的ForEach-Object无法正常工作

时间:2017-01-11 23:30:57

标签: powershell

有人可以向我解释为什么以下工作

$Users = 'First1 Last1','First2 Last2','First3 Last3'

foreach ($User in $Users)
{
    (Get-ADUser -Filter *).Where{$_.Name -like "*$User*"}
}

但这不是

$Users | % { (Get-ADUser -Filter *).Where{$_.Name -like "*$_*"} }

我觉得它基本上完全相同,但第一个命令返回数据而第二个命令没有

2 个答案:

答案 0 :(得分:1)

这不是一回事,因为.Where{$_.Name -like "*$_*"}使用当前对象变量两次。在$_.Name中它应该引用Get-ADUser中的当前对象,而在"*$_*"中它应该引用来自$Users的当前字符串,但实际上也引用来自Get-ADUser的当前对象$Users | % { $u = $_; (Get-ADUser -Filter *).Where{$_.Name -like "*$u*"} }

这样的话会使两个陈述相同:

Coordinates xy

答案 1 :(得分:1)

在第二个循环中,变量$_开始成为$Users数组的第一个用户,但它被Get-ADUser的输出覆盖。

换句话说,在{$_.Name -like "*$_*"} *$_*中的第二个循环中,您认为它等同于$User,而不是private void btnAddItems_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "Names|*.txt"; if(ofd.ShowDialog() == DialogResult.OK) { string[] recipients = File.ReadAllLines(ofd.FileName); foreach(string name in recipients) { lvRecipient.Items.Add(name); //increment the number of items in the list foreach(int item in lvRecipient.Items) { int i = 0; i++; lbCount.Text = i.ToString(); } } }