Можно ли преобразовать следующий блок сценария PS
$env:Path -split ";" | where {$_ -like "c:\Program*"}
в оператор сравнения where, похожий на
$env:Path -split ";" | where ???WHAT HERE??? -like "c:\Program*"
Нет, это невозможно.
Существует два режима для Where-Object
.Полностью выраженный, один выглядит так:
ls | Where-Object -FilterScript { $_.Name -eq 'File.txt' }
Здесь мы пишем скрипт-блок, содержащий выражение, которое оценивается для каждого элемента.
Другой режим, полностью выраженный, фактическивыглядит следующим образом.
ls | Where-Object -Property Name -Value File.txt -Eq
Обратите внимание, что -Eq
здесь - это параметр и , а не оператор.Мы вызываем команду, а не пишем здесь выражение в блоке скриптов.И я знаю, о чем ты думаешь.«Но чтобы работать таким образом, команде нужно было бы установить разные параметры для каждого мыслимого оператора!»И это именно то, что они делают !
Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-EQ] [<CommonParameters>]
Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-NE] [<CommonParameters>]
Where-Object [-InputObject <PSObject>] [-Property] <String> [[-Value] <Object>] [-LT] [<CommonParameters>]
[...]
Параметр -InputObject
является значением из конвейера.-Property
- первый позиционный параметр.-Value
является вторым позиционным параметром.
Проблема в том, что параметр -Property
является обязательным .Вы не можете вызвать эту команду без указания имени параметра, и нет имени свойства, которое означает «этот объект».