通过管道传递多个值
Pass multiple values through pipeline
我希望能够通过我正在构建的模块的管道传递多个值。该模块是围绕特定的 SQL 数据库架构构建的,因此我将此功能设计为 return 该架构的所有数据库:
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 参数块:
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
脚本块允许输出多个对象,就像任何其他脚本块一样;例如:
PS> 'one', 'two' | & { param([Parameter(ValueFromPipeline)] $str) process { $str; 'hi' } }
one
hi
two
hi
请记住,return <object>
只是用于输出 <object>
和 从脚本块返回的语法糖,您不需要 return
到输出一个对象。
然而,鉴于您的具体要求 - 通过管道 将另一个函数的 两个 参数与您函数的输出 绑定 - 您需要:
使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
)
我希望能够通过我正在构建的模块的管道传递多个值。该模块是围绕特定的 SQL 数据库架构构建的,因此我将此功能设计为 return 该架构的所有数据库:
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 参数块:
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
脚本块允许输出多个对象,就像任何其他脚本块一样;例如:
PS> 'one', 'two' | & { param([Parameter(ValueFromPipeline)] $str) process { $str; 'hi' } }
one
hi
two
hi
请记住,return <object>
只是用于输出 <object>
和 从脚本块返回的语法糖,您不需要 return
到输出一个对象。
然而,鉴于您的具体要求 - 通过管道 将另一个函数的 两个 参数与您函数的输出 绑定 - 您需要:
使
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
)