2015-06-21 90 views
2

我试图找到姓名但转换非英语变音符号AD用户英语迹象功能里面哪里,宾语从句

例。转换ŁL

所以我写了:

Get-ADUser -Filter * -Properties GivenName, Surname | Where-Object { 
    [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding("Cyrillic").GetBytes($_.GivenName)) -eq $name 
} 

它的工作很好,但我得到了一个错误:

Exception calling "GetBytes" with "1" argument(s): "Array cannot be null."

不PowerShell的不喜欢的where子句中的功能?

+2

是否所有的用户都有'GivenName'非空? – PetSerAl

+0

@PetSerAl不,因为它仍然返回一个有效的结果(在这种情况下为1个用户) – Fr33c3l

回答

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[]代替,导致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,你只是路过一个空字符串GetBytes(),这是完全有效的

+0

@ mathias-r-jessen不知道如何谢谢你!完美的工作 – Fr33c3l