powershell - 通过管道传递多个值

标签 powershell pipeline parameterbinding

我希望能够通过管道为我正在构建的模块传递多个值。该模块是围绕特定的 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 才能正常工作。

删除-TRISDeadLinks 参数 block :
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

最佳答案

一般情况下,process脚本 block 允许像任何其他脚本 block 一样输出多个对象;例如。:

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

请记住 return <object>只是输出 <object> 的语法糖并从脚本 block 返回,并且您不需要 return输出一个对象。

但是,鉴于您的特定要求 - 通过管道将另一个函数的两个参数与您的函数输出绑定(bind) - 您需要:
  • 制作 Get-TRISDatabases输出一个自定义对象,其属性是要传递给两个参数的参数。
  • 定义您的其他函数以通过属性名称从管道中绑定(bind)这些属性。

  • # 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() block 如下(PSv3+;注意参数默认是非强制的,它们的位置由它们的声明顺序暗示):
    # Remove-TRISDeadLinks ...
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        $ServerAddress = "localhost"
        ,   
        [Parameter(ValueFromPipelineByPropertyName)]
        $Databases
    )
    

    关于powershell - 通过管道传递多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52940445/

    相关文章:

    powershell - Powershell-将计算机添加到Active Directory中的安全组

    iis-7 - Powershell IIS7 管理单元将 SSL 证书分配给 https 绑定(bind)

    c++ - 使用 tbb 并行化视频转换程序

    mips - 在MIPS流水线中,如果下一条指令覆盖前一个寄存器的寄存器,流水线中是否会出现停顿?

    php - PDO 不绑定(bind)参数

    Powershell 参数绑定(bind) ByPropertyName 和 ByValue

    windows - 如何使新的子文件夹固有权限(windows server 2008)

    c# - Powershell正则表达式从日志文件中的行中提取圆括号之间的字符串

    jenkins - 在 Jenkins 管道的各个阶段之间传输数据

    php - Mysqli参数绑定(bind)问题