来自管道的switch参数的值

时间:2015-12-24 10:53:43

标签: powershell pipeline

我需要通过从CSV文件导入所需的值,将参数从管道输入传递给脚本。原始脚本有超过15个参数要传递,输入值存储在CSV文件中。我发布了一个简单的例子来表达这个问题。

以下是CSV文件(Input.csv

的内容
ResourceGroupName,SetThrottling
TestRG1,1
TestRG2,0
TestRG3,1
TestRG4,0
TestRG5,0

脚本文件 - Switch-FromPipelineTest.ps1

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
  [String]$ResourceGroupName,

  [Parameter(ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
  [Switch]$SetThrottling
)

Begin {}
Process {
  Function TestingValues {
    Param(
      $ResourceGroupName,
      $SetThrottling
    )

    Write-Host "$ResourceGroupName is set to $SetThrottling"
  }

  TestingValues -ResourceGroupName $ResourceGroupName -SetThrottling $SetThrottling
}
End {}

如果我运行命令Import-Csv .\Input.csv | .\Switch-FromPipelineTest.ps1,则会出现如下错误:

C:\Scripts\Switch-FromPipelineTest.ps1 : Cannot process argument
transformation on parameter 'SetThrottling'. Cannot convert value
"System.String" to type "System.Management.Automation.SwitchParameter".
Boolean parameters accept only Boolean values and numbers, such as
$True, $False, 1 or 0.
At line:1 char:26
+ Import-Csv .\Input.csv | .\Switch-FromPipelineTest.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (@{ResourceGroup...etThrottling=1}:PSObject) [Swith-FromPipelineTest.ps1], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Switch-FromPipelineTest.ps1

为了使这项工作,我必须在命令下运行:

Import-Csv -Path .\Input.csv -Verbose |
  Select-Object -Property ResourceGroupName,@{n='SetThrottling';e={[bool][int]$_.SetThrottling}} |
  .\Switch-FromPipelineTest.ps1

有没有办法在第二个命令中省略使用自定义属性表达式完成的类型转换?与原始脚本一样,我有几个[switch]参数,我需要为每个[switch]参数执行相同的操作。

1 个答案:

答案 0 :(得分:2)

导入CSV时将字符串值转换为布尔值:

Import-Csv 'C:\path\to\input.csv' |
    Select-Object -Property *,@{n='SetThrottling';e={
        [bool][int]$_.SetThrottling
    }} -Exclude SetThrottling | ...

您需要为要从CSV导入的每个开关参数执行此操作。

如果您想避免这种情况,请将参数从开关更改为设置验证参数,并相应地调整参数评估:

[Parameter(ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
[ValidateSet('0', '1')]
[string]$SetThrottling