对于管道中的单个对象,是否有比使用foreach更简洁的方法?

时间:2016-09-28 12:09:25

标签: powershell

我的脚本正在运行,但是当我在管道中使用foreach-object作为单个项目时,我觉得我做错了。这是代码:

$computers = ('Computer1','Computer2')

ForEach($computer in $computers){
Get-ADComputer $computer -Properties description | ForEach{$_.description -split ','} | Select -first 1 | 
Get-ADUser | ForEach{$computer + ": " + $_.name} 
}

该脚本正在AD中检索计算机,并查看所有者的说明。我只需要描述的第一部分,所以我将逗号分开。

我的问题:像这样使用ForEach是否正确:

ForEach{$_.description -split ','}

当它看起来像是

$_.description -split ','

应该足够了,因为它无论如何只是管道中的一个项目。 (但这显然给出了“表达式只允许作为管道的第一个元素”

对不起,这很乱,我希望有人理解我的目标。

编辑:

阅读答案后,这是我的最终代码:

$computers = ('Computer1','Computer2')

ForEach($computer in $computers){

Get-ADComputer $computer -Properties description | ForEach{$s = $_;  ($s.description -split ',')[0]} | Get-ADUser | ForEach{$computer + ": " +   $_.name} 
}

1 个答案:

答案 0 :(得分:3)

你是不是需要以你的方式对其进行编码是正确的,但有两点值得:

  1. 可读性可能会因为更简洁而受到阻碍
  2. 有时您无法保证只会返回一个对象
  3. 您可以将第一位更改为此类

    ((Get-ADComputer $computer -Properties description).description -split ',')[0] | Get-ADUser | ...
    

    如果只返回一个计算机对象,那应该做同样的事情。可能会出现这种情况,但并不总是这种逻辑。我认为你拥有它的方式更简单。

    我可能会这样做

    $computers = ('Computer1','Computer2')
    
    ForEach($computer in $computers){
        Get-ADComputer $computer -Properties description | 
            ForEach{($_.description -split ',')[0]} |
            Get-ADUser | ForEach{$computer + ": " + $_.name} 
    }
    

    这里我通过在foreach循环中获取所需元素来删除select。我还更改了缩进以显示长管道语句的关系。我最初做了一个错误的评论,因为你缩进让我看到Get-ADUser | ForEach{$computer + ": " + $_.name}作为一个独特的陈述。