Powershell-仅选择IF语句的结果

时间:2018-08-06 16:45:25

标签: powershell office365

我希望将JSON文件中组的成员列表与Office 365中的实际组进行比较,并导出仅包含组名称和JSON文件中不属于生产组成员的成员的列表。

我首先导入JSON数据:

$jsonFiles = Get-ChildItem -path "c:\tmp\json" -filter *.json | get-content -raw

$allobjects = $jsonFiles | convertfrom-json

接下来,我有一个变量,该变量获取所有Office 365统一组的成员:

$prodGrpMemb = Get-UnifiedGroup | Get-UnifiedGroupLinks -LinkType members | select -ExpandProperty name

我现在需要创建一个将提供所需输出的函数。到目前为止,这就是我所拥有的:

function get-MissingMembers {

 [CmdletBinding()]
 Param(
 [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
 $InputObject,

 [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
 $prodMember
 )

    Process {
                foreach($displayname in $InputObject.displayname){
                    if($InputObject.members -notin $prodMember)
                    {
                        write-output $InputObject.displayname,$InputObject.members | `
                        out-file -Append c:\tmp\MissingMembers.txt
                        }
                         else{
                                continue
                              }
                }
        }
}

然后我用这个调用函数:

$allobjects | get-GroupCount -prodMember $prodGrpMemb

问题在于当前的写输出会选择所有组。如何只选择与IF语句匹配的结果?

预先感谢您的考虑!

1 个答案:

答案 0 :(得分:0)

因为这就是您编码的目的。 但是,您的代码中存在逻辑和语法问题。

这真的是收藏吗?

$InputObject
$prodMember

目前,这两个参数仅接受一个值。将它们声明为[string []]将使它们接受整个值集合。然后,您可以使用Foreach循环进行枚举,以便一次可以使用一个值。

[string[]]$InputObject
[string[]$prodMember

此外,如果是这样,则不会显示在何处获得这些物品或它们的外观。

有了这个...

$InputObject.displayname

…您仅从$ InputObject数组/集合中所有可能的项目中返回显示名称。所以,这个……

$InputObject.members

...对所追求的不谨慎。您刚刚调用了默认集合。因此,将它们全部获取。

至此

write-output $displayname,$InputObject.members | 
out-file -Append c:\tmp\MissingMembers.txt

如所写,这将显示当前正在处理的Displaname和$ InputObject数组中的所有成员。这就是为什么您看到它们全部的原因。

如果您只想念MissingMembers,则不需要$ InputObject.members

因此,类似这样的事情应该可以工作,但由于我不知道这些收藏夹中的真正含义,因此无法在我这边进行测试。

function get-MissingMembers 
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Position=0, Mandatory=$true, 
        ValueFromPipeline=$true)]
        [string[]]$InputObject,

        [Parameter(Position=0, Mandatory=$true, 
        ValueFromPipeline=$true)]
        [string[]]$prodMember
    )

    Process 
    {
        # Return the displayname from the InputObject
        foreach($displayname in $InputObject.Displayname)
        {
            # Validate displaynmae is a prodMember
            if($displayname -notin $prodMember)
            {
                # Generate report of only non-matching member names
                write-output $displayname | 
                out-file -Append 'c:\tmp\MissingMembers.txt'
            }
            else
            { continue }
        }
    }
}
相关问题