我正在尝试按姓名和姓氏查找AD用户,但将非英语变音符号转换为英语符号
实施例。将Ł
转换为L
等。
所以我写道:
Get-ADUser -Filter * -Properties GivenName, Surname | Where-Object {
[Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($_.GivenName)) -eq $name
}
它工作正常,但我收到错误:
异常调用" GetBytes"用" 1"参数:"数组不能为空。"
Powershell不喜欢where子句中的函数吗?
答案 0 :(得分:1)
如果AD用户没有设置GivenName
属性,或者您忘记通过在AD cmdlet调用中指定-Properties GivenName
来检索它,$_.GivenName
将评估为$null
。
[Encoding]::GetBytes()
has a number of overloads:
byte[] GetBytes(char[] chars)
byte[] GetBytes(char[] chars, int index, int count)
byte[] GetBytes(string s)
当您传递$null
值时,.NET运行时无法确定$null
是否表示空字符串,而是选择需要char[]
的重载,从而导致{ {1}}错误。
将Array cannot be null
括在双引号中,强制将其识别为字符串,消除任何歧义:
$_.GivenName
这样,如果[Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes("{0}" -f $_.GivenName))
# or
[Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes("$($_.GivenName)"))
评估为$_.GivenName
,您只需将空字符串传递给$null
,这是完全有效的