Назад | Перейти на главную страницу

Powershell, где-объект -notlike

Если я буду трубить where-object { $_.someProperty -notlike "*someValue*" }, то -notlike похоже, фильтрует не только совпадения, но и объекты, someProperty пусто.

where-object -notlike из TechNet:

Specifies the Not-Like operator, which gets objects when the property value does not match a value that includes wildcard characters.

Исходя из определения, почему -notlike не возвращать объекты, чьи someProperty пусто? Поскольку совпадений не найдено?

Чтобы уточнить: я выполняю Get-ADComputer -Filter * -Property MemberOf,someotherstuff,someotherstuff | where-object { $_.memberof -notlike "*somepartialdn*" }

Ожидается, что объект компьютера будет возвращен, поскольку совпадения нет, даже если значение свойства равно null.

Это зависит от вашего определения слова «пустой».

Если someProperty не имеет значения, это эффективное значение $null. Ваше сравнение строк не применяется к $null.

Если someProperty это пустая строка ("" или [String]::Empty) вместо этого применяется сравнение строк.

$values = "indonesia","turkmenistan",$null,"columbia"
$values |Where-Object {$_ -notlike "*istan"}
# Results in @("indonesia","columbia")

$values = "indonesia","turkmenistan",[String]::Empty,"columbia"
$values |Where-Object {$_ -notlike "*istan"}
# Results in @("indonesia","","columbia")

Это всего лишь предположение, но вы можете обойти это, выполнив следующие действия:

where-object { $_.someProperty -ne "" -and $_.someProperty -notlike "*someValue*" }

Я почти уверен, что то, что вы испытываете, связано с тем, что данные передаются в виде строки ... и поэтому пустые значения принимаются как ""