循环处理组别名

时间:2018-07-17 17:12:01

标签: powershell office365

我在使函数正确循环时遇到问题。目标是将一些JSON数据的输出与Office 365中的现有统一组进行比较,如果该组已经存在,请跳过该组,否则,请创建一个新组。棘手的部分是,作为创建组的函数的一部分,它在组名前添加了“ gr-”。由于比较功能是将没有JSON的原始JSON数据与Office 365进行比较,因此比较功能必须具有逻辑上可以随时添加“ gr-”的逻辑。如果有更好的方法来完成最后一部分,我当然愿意提出建议。

此处是该功能的最新版本。还存在其他变体,但到目前为止没有一个起作用。没有错误,但是代码没有标识出确实存在的列表。我出于测试目的使用简单的echo语句,实际的代码将包括创建新组的功能。

# Test variable that cycles through each .json file.
$jsonFiles = Get-ChildItem -Path "c:\tmp\json" -Filter *.json |
             Get-Content -Raw

$allobjects = ForEach-Object {
    $jsonFiles | ConvertFrom-Json
}

$alreadyCreatedGroup = ForEach-Object {Get-UnifiedGroup | select alias}

# Determine if list already exists in Office 365
function checkForExistingGroup {
    [CmdletBinding()]
    Param(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
        $InputObject
    )

    Process {
        if ("gr-$($InputObject.alias)" -like $alreadyCreatedGroup) {
            echo "Group exists"
        } else {
            echo "Group does not exist"
        }
    }
}

$allobjects | checkForExistingGroup
#$alreadyCreatedGroup | checkForExistingGroup

上面的代码始终会为JSON数据中的每个别名生成“组不存在”。

各个变量似乎输出正确:

PS> $alreadyCreatedGroup

Alias                     
-----                     
gr-jsonoffice365grouptest1
gr-jsonoffice365grouptest2
gr-jsonoffice365grouptest3


PS> $allobjects.alias

jsonoffice365grouptest3
jsonoffice365grouptest4

如果我自己运行以下命令:

"gr-$($allobjects.alias)"

我得到以下输出:

gr-jsonoffice365grouptest3 jsonoffice365grouptest4

因此,它独自将JSON文件的输出追加,但是我希望通过在函数中使用$InputObject来解决该问题。

1 个答案:

答案 0 :(得分:0)

好吧,单个组永远不会-like是组列表。您要检查组列表是否 别名。

if ($alreadyCreatedGroup -contains "gr-$($InputObject.Alias)") {
    echo "Group exists"
} else {
    echo "Group does not exist"
}

在PowerShell v3或更高版本中,您也可以使用-in运算符代替-contains运算符,这对大多数人来说更自然:

if ("gr-$($InputObject.Alias)" -in $alreadyCreatedGroup) {
    echo "Group exists"
} else {
    echo "Group does not exist"
}

我建议将组列表作为参数传递给函数,而不要使用全局变量:

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

        [Parameter(Mandatory=$true, ValueFromPipeline=$false)]
        [array]$ExistingGroups
    )

    ...
}

"gr-$($allobjects.Alias)"不会产生预期的结果,因为该表达式基本上意味着:取数组/集合Alias中所有元素的$allobjects属性,将它们的值与$OFS字符(输出字段分隔符),然后将结果插入子字符串“ gr-”之后。不过,这并不影响您的功能,因为管道已经展开了输入数组,因此该功能一次只能看到一个输入对象。