【问题标题】:Powershell foreachPowershell foreach
【发布时间】:2014-10-20 16:10:29
【问题描述】:

我正在尝试遍历用户列表,以便提取他们的属性,但我对 Powershell 还很陌生,不了解我得到的输出。

foreach ($user in $AllUsers) 
{  
  get-member -inputobject $user; 
  write-host " "
}

$AllUsers 对象有六个用户,每个用户都有一组属性和方法。但是,当我运行上面的代码块时,输出是六个空行,然后是每个用户连续六次的属性和方法列表。我试图让每个用户的属性和方法用空行分隔。有人可以帮我理解为什么输出运行write-host 六次然后get-member 六次吗?

【问题讨论】:

    标签: powershell foreach


    【解决方案1】:

    我认为正在发生的事情是Get-Member 的结果被放入管道并排队等待块完成。相比之下,Write-Host 的副作用会在每个循环中立即发生。您可以通过写入字符串输出来解决此问题:

    foreach($user in $AllUsers)
    {
        $user | gm | out-string
    }
    

    这将打印每个项目的成员,中间有一些空格。大多数情况下,给定类型的所有对象都具有相同的成员,但偶尔会有动态定义的成员。

    【讨论】:

    • 如果由于某种原因必须使用 write-host 来添加内容,这也会以所需的顺序打印
    • 这正是我需要知道的。谢谢。
    【解决方案2】:

    它的行为是这样的,因为你也说过:)

    当您使用 foreach 时,您正在为集合 ($AllUsers) 中的每个项目执行代码块中的任何操作。因此,对于每个用户,首先完成一个 get-member,然后 write-host 写入一个空行。

    为什么要为每个用户写出属性和方法?它们将是相同的。

    如果您只想列出具有所有属性的用户,您可以这样做:

    $AllUsers | format-list *
    

    然后你可以看到所有的属性,当你决定要显示哪一个后,你可以选择只查看那些:

    $AllUsers | Select-Object Prop1,Prop2,Prop4,Prop10
    

    【讨论】:

    • PowerShell 的扩展类型系统添加的每个对象上可能有不同的成员。这些可以通过 Add-Member cmdlet 添加。
    • 哈哈,我还没有达到 Powershell 的扩展类型级别。最终,我试图从一个广告中提取用户列表并将它们插入另一个广告。我意识到每个用户的属性和方法列表都是相同的,所以这个特定命令的输出不是必须的,但是当我试图构建我的循环来提取属性时,我遇到了这个它让我陷入了一个循环,可以这么说。不过我打算使用 ojk 的 Select-Object,它看起来非常有用。
    【解决方案3】:

    Get-Member 写入成功输出流,而Write-Host 写入控制台(或者更确切地说是主机程序)。不同的输出不能保证按照各自语句的运行顺序显示。当您有语句将输出写入成功输出流以及错误输出流(或其他输出流之一,如警告或调试)时,您也可以获得此行为。请参阅 here 以更深入地讨论 PowerShell 中的输出。

    如果您想在每组对象成员之后打印一个空行,请将Write-Host 替换为Write-Output

    foreach ($user in $AllUsers) {  
      Get-Member -InputObject $user
      Write-Output ''
    }
    

    你也可以这样做:

    foreach ($user in $AllUsers) {  
      (Get-Member -InputObject $user) + ''
    }
    

    或者像这样:

    $AllUsers | % { (Get-Member -InputObject $_) + '' }
    

    【讨论】:

    • 这很有帮助,谢谢。你和 mike z 都是正确的,但我给了他正确的答案,因为它是第一位的。
    猜你喜欢
    • 2015-01-04
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多