我希望将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语句匹配的结果?
预先感谢您的考虑!
答案 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 }
}
}
}