我在我的PowerShell脚本中使用S.DS.P PowerShell module。在其中,我必须创建以下对象:
$ADUserEntry = @{"distinguishedName"=$null;"objectClass"=$null;"sAMAccountName"=$null;"unicodePwd"=$null;"userAccountControl"=0};
在documentation of the module中,我必须对使用该对象创建的变量的unicodePwd
字段进行以下分配:
$obj.unicodePwd = ,([System.Text.Encoding]::Unicode.GetBytes("$randomPassword") -as [byte[]]);
请注意在第一个括号之前如何使用逗号。那个逗号在那做什么?
答案 0 :(得分:1)
正如Lee_Daily所指出的那样,您看到的是 {strong> "comma operator"”的 一元形式 ,即 PowerShell的数组构造运算符 。
一元形式创建一个单元素数组,该数组包装其(唯一的)操作数;数组的类型为[object[]]
,就像在PowerShell中一样:
$arr = , 'foo' # wrap string 'foo' in a single-element array
$arr.GetType().Name # the array's type -> 'Object[]'
$arr[0].GetType().Name # the type of the array's one and only element -> 'String'
请注意,尽管您甚至可以用这种方式包装数组,但是PowerShell的运算符优先级规则要求将文字数组操作数括在(...)
中:
# OK - wraps array 1, 2 in a single-element array.
$arr = , (1, 2)
# !! DOES SOMETHING DIFFERENT:
# Creates a 2-element array whose 1st element is integer 1 wrapped in a
# single-element array
$arr = , 1, 2
二进制形式按预期从操作数构造一个数组:
$arr = 1, 2, 3 # 3-element array whose elements are integers 1 and 2 and 3
顺便说一句,重新显示显示的特定命令:
,([System.Text.Encoding]::Unicode.GetBytes("$randomPassword") -as [byte[]])
在这种情况下,不需要,
和-as [byte[]]
,因为
[System.Text.Encoding]::Unicode.GetBytes()
直接 返回一个[byte[]]
数组。