Передать несколько значений через конвейер - PullRequest
0 голосов
/ 23 октября 2018

Я хочу иметь возможность передавать несколько значений по конвейеру для модуля, который я собираю.Модуль построен на основе определенной схемы базы данных SQL, поэтому я разработал эту функцию для возврата всех баз данных этой схемы:

function Get-TRISDatabases {
    param (
        [parameter(mandatory=$false)]
        [string]$ServerAddress = "localhost",
        [parameter(mandatory=$false)]
        [switch]$Name
    )
    Begin {
        $Query_GetDatabases = "
            SELECT Name, create_date, user_access_desc, state_desc, recovery_model_desc FROM   sys.databases WHERE  CASE
                WHEN state_desc = 'ONLINE' THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[CRISFiles]', 'U')
            END IS NOT NULL
        "
    }

    Process {
        ## Get Data
        $rValue = Invoke-Sqlcmd2 -Query $Query_GetDatabases -ServerInstance $ServerAddress

        ## Return values
        if ($Name) {
            Return $rValue.Name
        }
        else {
            Return $rValue
        }
    }

    End {
        ## Purge Variables
        Remove-Variable Query_GetDatabases, rValue
    }
}

Это работает нормально, но я хочу, чтобы была возможность передавать как $ serverAddress, так ипеременные $ rValue через конвейер.Это так, что я могу запускать другие команды, например, так:

Get-TRISDatabases -name -ServerAddress "server1" | Remove-TRISDeadLinks

Вместо того, что у меня есть в данный момент, которое будет:

Get-TRISDatabases -name -ServerAddress "server1" | Remove-TRISDeadLinks -ServerAddress "server1"

Я попытался поместить адрес сервера в rValueобъект, но я должен был бы изменить любой другой сценарий на пользовательский адрес сервера rValue.ServerAddress, чтобы это работало.

Remove-TRISDeadLinks Блок параметров:

param (
    [parameter(
        Mandatory=$false, Position=1,ValueFromPipeline=$false
    )]
    $ServerAddress = "localhost",

    [parameter(
        Mandatory=$false, Position=2,ValueFromPipeline=$true
    )]
    $Databases
)

-

.EXAMPLE
Remove-TRISBrokenLinks -ServerAddress "localhost" -Databases "Database1"

    Manually entering the server address and database

.EXAMPLE 
Remove-TRISBrokenLinks -ServerAddress "localhost" -Databases "Database1", "Database2"

    Runs against an array of databases names

.EXAMPLE 
Get-TRISDatabases -ServerAddress "Localhost" -name | Remove-TRISBrokenLinks

    Uses the Get-TRISDatabases function to pass all TRIS databases to the function

1 Ответ

0 голосов
/ 23 октября 2018

Как правило, блок сценария process позволяет выводить несколько объектов, как и любой другой блок сценария;Например:

PS> 'one', 'two' | & { param([Parameter(ValueFromPipeline)] $str) process { $str; 'hi' } } 
one
hi
two
hi

Помните, что return <object> - это просто синтаксический сахар для вывода <object> и , возвращающихся из блока скрипта, и что вам не нужно return to вывод объект.


Однако, учитывая ваши специфические требования - связывание двух параметров другой функции с выходом вашей функции через конвейер - вам необходимо:

  • сделать Get-TRISDatabases вывести пользовательский объект , свойства которого являются аргументами для передачи обоим параметрам.

  • определите вашу другую функцию для привязки этих свойств из конвейера по имени свойства .

# Get-TRISDatabases ...

Process {
    ## Get Data
    $rValue = Invoke-Sqlcmd2 -Query $Query_GetDatabases -ServerInstance $ServerAddress

    # Output a custom object with both $rValue and the server address
    [pscustomobject] @{
      ServerAddress = $ServerAddress
      Databases = if ($Name) { $rValue.Name } else { $rValue }
    }

}

# ...

Затем определите свой блок Remove-TRISDeadLinks param()следующим образом (PSv3 +; обратите внимание, что параметры не являются обязательными по умолчанию и что их положение подразумевается в порядке их объявления):

# Remove-TRISDeadLinks ...
[CmdletBinding()]
param (
    [Parameter(ValueFromPipelineByPropertyName)]
    $ServerAddress = "localhost"
    ,   
    [Parameter(ValueFromPipelineByPropertyName)]
    $Databases
)
...