gpt4 book ai didi

powershell - 具有不同参数的动态调用命令

转载 作者:行者123 更新时间:2023-12-04 02:08:32 25 4
gpt4 key购买 nike

在 PowerShell 脚本中,我想读取包含如下内容的 CSV 文件:

Type  Title      Param1        Param2       
---- ----- ------ ------
Type1 Foo type 1 ValueForType1
Type2 Foo type 2 ValueForType2

当类型为 Type1 时,我必须调用名为 New-FooType1 的函数,当类型为 Type2 时,该函数名为 New-FooType2,依此类推:

function New-FooType1{
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Title,
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Param1
)

Write-Host "New-FooType1 $Title with $Param1"
}

function New-FooType2{
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Title,
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Param2
)

Write-Host "New-FooType2 $Title with $Param2"
}

我正在尝试使用动态调用将调用路由到任一函数:

$csv | % {
$cmdName = "New-Foo$($_.Type)"
Invoke-Command (gcm $cmdName) -InputObject $_

}

但是,我总是得到一个错误:

Parameter set cannot be resolved using the specified named parameters

如您所见,不同的类型意味着不同的参数集。

我该如何解决这个问题?我想避免手动操作属性,因为在我的现实生活脚本中,我有十几种不同的类型,最多有 6 个参数。

这是问题的完整重现示例:

$csvData = "Type;Title;Param1;Param2`nType1;Foo type 1;ValueForType1;;`nType2;Foo type 2;;ValueForType2"

$csv = ConvertFrom-csv $csvData -Delimiter ';'

$csv | ft -AutoSize

function New-FooType1{
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Title,
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Param1
)

Write-Host "New-FooType1 $Title with $Param1"
}

function New-FooType2{
param(
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Title,
[Parameter(Mandatory=$true, ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[string]$Param2
)

Write-Host "New-FooType2 $Title with $Param2"
}


$csv | % {
$cmdName = "New-Foo$($_.Type)"
Invoke-Command (gcm $cmdName) -InputObject $_

}

这个脚本的预期输出是:

New-FooType1 Foo type 1 with ValueForType1
New-FooType2 Foo type 2 with ValueForType2

最佳答案

使用调用操作符&:

$CmdName = "New-FooType1"
$Arguments = "type1"

& $CmdName $Arguments

调用运营商也支持splatting如果您希望参数绑定(bind)到特定的命名参数:

$Arguments = @{
"title" = "type1"
}

& $CmdName @Arguments

关于powershell - 具有不同参数的动态调用命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34176356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com