2015-12-24 55 views
0

我需要通過從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

'[轉] [BOOL] [INT] $ SetThrottling' – PetSerAl

+0

@PetSerAl是對的。問題是'Import-CSV'正在創建所有值字符串。你只需要修復劇組。 – Matt

+0

你的意思是,這需要在Param()塊中完成嗎? – SavindraSingh

回答

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 
+0

這似乎是我唯一的選擇(如Ctrl + Alt + Del :-))。我會做的。謝謝。 – SavindraSingh