我在PowerShell中编写以下函数,并在执行时生成错误:
Get-ADUser : Error parsing query: 'EmployeeId -eq ' Error Message: 'syntax error' at position
: '12'.
At line:14 char:16
该功能如下。
Function UpdateGroupMembership ($Members, $Group, $err) {
$Members | ForEach-Object {
$EID = $_.ID
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
If ((Get-ADUser -Filter $filter) -like "")
{$err += "`n"+"User: "+$_."First Name"+" "+$_."Last Name"+" was not found in "+$_."District"+"<br>"}
Else
{$alias += Get-ADUser -Filter $filter}
}
$alias | ForEach-Object {
Add-ADGroupMember -Identity $Group -Members $_.SamAccountName
}
}
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
任何建议都将受到高度赞赏!刚刚学习PowerShell ...所以请放轻松我!
答案 0 :(得分:1)
很难准确说明您的代码是如何工作的,因为您没有向我们展示任何输入,但以下是第一个主要问题
功能参数
UpdateGroupMembership ($atl, $atlGroup, $atlerr)
功能不是方法。当您调用函数时,您将所有参数作为数组发送到参数$Members
。电话必须看起来像这样。
UpdateGroupMembership $atl, $atlGroup, $atlerr
If
阻止
((Get-ADUser -Filter $filter) -like "")
不确定您要完成什么,但-like
通常用于字符串比较。 Get-ADUser
将返回一个对象数组或$null
。你在测试它是否为空或空?
If(Get-ADUser -Filter $filter){
}
只有返回数据,上述情况才会成立。
关于$err
您是否尝试通过该变量传回信息?函数是值的默认传递信息,因此您填充$err
将无法在函数外使用。
答案 1 :(得分:1)
我认为这里有一些理解和功能和参数,以及错误处理。你遗漏了一些信息,所以我假设$atl
是一个对象数组,并且每个对象都有(至少)属性&#39; ID&#39;,&#39; First Name& #39;和&#39;姓氏&#39;。我假设$atlGroup
是一个字符串,它是要添加在这些对象中定义的用户的组的名称。我还假设$atlerr
可能没什么,但是如果它们发生,你希望它被填充错误。
这真的归结为马特在答案中所说的话。您正在调用您的函数错误。您传递的是一组对象作为第一个参数(&#39; Members&#39;参数)。所以这就是你拥有它的功能流程......
$Members = @($atl, $atlGroup, $atlErr)
$Group = $null
$Err = $null
$Members
然后传递给ForEach循环,因此它传递了它的第一个项目,即一个对象数组。它将整个$atl
数组传递给ForEach循环,以便现在循环:
$EID = $atl.ID
好吧,我们有一个问题。 $ atl是一个数组,它没有“ID&#39;”的属性。就像它包含的所有对象一样。所以它返回$null
,所以......
$EID = $null
$filter = [scriptblock]::Create("EmployeeId -eq $EID")
好的,现在$filter
是一个看起来像{EmployeeId -eq $null}
的脚本块,作为一个脚本块就可以了。问题是当它作为-Filter
参数的参数传递给Get-ADUser cmdlet时,该参数希望您提供以下格式的内容:
Property Operator Value
您正在查看EmployeeID属性,并使用-eq
运算符。该属性是一个字符串,因此它希望您提供一个字符串来与之进行比较。你不这样做,所以它会抛出一个错误。
现在你希望用你的If / Else语句来捕捉这些错误,但是你只是简单地重新创建了那个轮子。 PowerShell已经有了Try / Catch块,以及它们的工作原理。如果Try
导致脚本停止的操作,而不是停止它将移动到Catch
脚本块并执行该操作。
为了简化您的工作,我们可以Try
获取广告用户,并将其直接导入add-adprincipalgroupmembership
(此cmdlet接受用户对象中的管道传输,并允许您定义将您添加到的组,而不是您使用的接受管道组对象的cmdlet,并允许您定义要添加到组的用户)。然后在Catch
块中输出您的错误,该错误应该仅在Try
块中的进程失败时发生。现在,您只需将函数的输出分配给您想要存储错误的内容。最终看起来像这样:
Function UpdateGroupMembership{
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
Get-ADUser -Filter {EmployeeId -eq "$($User.ID)"} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found." -f $User."First Name",$User."Last Name"
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup
马特的答案确实回答了你的问题,我只是想提供一些关于过程如何运作以及你为什么会遇到错误的指导,并就如何更好地编写函数给出一些建议你有什么可以和你一起前进的。我对Matt的答案进行了投票,它确实回答了这个问题,我只是想到一些额外的背景和帮助解决问题的方法是为了帮助新手。我们已经在某个时候到过那里。
编辑:我还应该提一下,我认为创建一个处理这类事情的函数是一个错误。您可以更好地处理一件事,接受管道输入或将其置于ForEach循环中。但这只是我的意见,接受或离开它。
答案 2 :(得分:0)
Function UpdateGroupMembership {
Param(
[object[]]$Members,
[String]$Group
)
ForEach($User in $Members){
Try{
$filter = $($User.ID)
Get-ADUser -Filter {EmployeeId -eq $filter} | Add-ADPrincipalGroupMembership -MemberOf $Group
}
Catch{
"User: {0} {1} was not found in {2}." -f $User."First Name",$User."Last Name", $User.District
}
}
}
$atlErr = UpdateGroupMembership $atl $atlGroup