Свойство неявного значения PowerShell в объекте where - PullRequest
0 голосов
/ 12 февраля 2019

Можно ли преобразовать следующие , где блок сценария PS

$env:Path -split ";" | where {$_ -like "c:\Program*"}

, в , где оператор сравнения, похожий на

$env:Path -split ";" | where ???WHAT HERE??? -like "c:\Program*"

Мне нужно что-то, что заменило бы неявную переменную $ _ из первого комментария.

Редактировать: Мое намерение - чистое любопытство.Я предпочитаю использовать второй способ командлета where-object, однако я не знаю, как обращаться к значению канала непосредственно в левой части -подобного оператора

Edit2: Что такое оператор сравнения? Оператор сравнения намного больше похож на естественный язык.Операторы сравнения были введены в Windows PowerShell 3.0.Пример:

Get-Process | Where-Object PriorityClass -eq "Normal"

Источник: Где-объект на MSDN

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы можете написать свою собственную функцию конвейера следующим образом:

    Add-Type -AssemblyName System.Collections

    function where-special { 
    [cmdletbinding()]

    param(
        [Parameter(ValueFromPipeline=$true)]
        [object[]]$piped,
        [Parameter(Position=1, ParameterSetName="eq")]
        [object]$eq,
        [Parameter(Position=1, ParameterSetName="like")]
        [object]$like,
        [Parameter(Position=1, ParameterSetName="match")]
        [object]$match )

    Begin {
        [System.Collections.Generic.List[object]]$found = @()

        $toDo = [Scriptblock]::Create( 'if( $piped -' + $PSCmdlet.ParameterSetName + ' $' + $PSCmdlet.ParameterSetName + ') { $found.Add( $piped ) }' )
    }

    Process  {

        & $toDo
    }

    End {
        return $found.ToArray()
    }
}


$env:Path -split ";" | where-special -like 'C:\Windows' 
0 голосов
/ 13 февраля 2019

Можно ли преобразовать следующий блок сценария 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 является обязательным .Вы не можете вызвать эту команду без указания имени параметра, и нет имени свойства, которое означает «этот объект».

0 голосов
/ 12 февраля 2019
$env:Path -split ";" | where { $_.StartsWith("C:\Program") -eq $True }
...