我在使函数正确循环时遇到问题。目标是将一些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
来解决该问题。
答案 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-”之后。不过,这并不影响您的功能,因为管道已经展开了输入数组,因此该功能一次只能看到一个输入对象。