Where-Object子句中的函数

时间:2015-06-21 11:39:43

标签: powershell

我正在尝试按姓名和姓氏查找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子句中的函数吗?

1 个答案:

答案 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,这是完全有效的