0

我正在查看下面的一个简单脚本,但我不明白为什么作者包含 "$($_.samAccountName)"以下$_.samAccountName内容 希望它是一个简单的答案,但为什么你会$()在代码中有额外的东西?

非常感谢。

Get-ADGroup -Filter * |

foreach {

$props = [ordered] @{

GroupName = $_.Name

MemberCount = Get-ADGroupMember -Identity "$($_.samAccountName)" | Measure-Object |   select -ExpandProperty Count

}

New-Object -TypeName psobject -Property $props

} | sort MemberCount 
4

2 回答 2

5

PowerShell 不评估字符串内的对象属性。如果你有这样的表达式:

"$_.samAccountName"

变量(在本例中为“当前对象”变量$_)扩展为其ToString()方法的返回值,而字符串 ( .samAccountName) 的其余部分保持不变。结果你会得到这样的东西:

"CN=Domain Users,CN=Users,DC=example,DC=com.samAccountName"

而不是组对象samAccountName属性的值。

$()在字符串中使用子表达式运算符

"$($_.samAccountName)"

强制 PowerShell 评估对象的属性并将结果放入字符串中。

例子:

PS C:\> $g = Get-ADGroup 'Domain Users'
PS C:\> $g

DistinguishedName : CN=Domain Users,CN=Users,DC=example,DC=com
GroupCategory     : Security
GroupScope        : Global
Name              : Domain Users
ObjectClass       : group
ObjectGUID        : 072d9eda-a274-42ee-a4ee-b4c2810bb473
SamAccountName    : Domain Users
SID               : S-1-5-21-1227823062-450780232-214340840-513

PS C:\> $g.ToString()
CN=Domain Users,CN=Users,DC=example,DC=com
PS C:\> "$g"
CN=Domain Users,CN=Users,DC=example,DC=com
PS C:\> "$g.samAccountName"
CN=Domain Users,CN=Users,DC=example,DC=com.samAccountName
PS C:\> "$($g.samAccountName)"
Domain Users

但是,正如CB正确所说,在您的特定情况下,您根本不需要$_.samAccountName用双引号引起来。像这样使用它:

$MemberCount = Get-ADGroupMember -Identity $_.samAccountName | ...

应该可以正常工作。

于 2013-10-21T13:27:00.900 回答
1

variable/expression expansion syntaxIMO在这种情况下没有理由使用。

也许原始作者将-Identity参数的值括在双引号中,希望确保变量扩展。

于 2013-10-21T12:11:19.543 回答