2016-11-11 76 views
4

我有一個PowerShell腳本CSV2JSON.ps1用下面的代碼:傳遞一個可選的參數

param(
     [String]$FieldSeparator=",", 
     [String[]]$Header 
) 

$input | ConvertFrom-Csv -Delimiter $FieldSeparator -Header $Header | ConvertTo-JSON 

如果我把它作爲.\CSV2JSON.ps1 -FieldSeparator "|" -Header "name|age"它工作正常。但是,如果我把可選參數Header,該ConvertFrom-Csv cmdlet的抱怨Header不能爲空:

ConvertFrom-Csv : Cannot validate argument on parameter 'Header'. 
The argument is null. Supply a non-null argument and try the command again. 

我不想在所有通過-Header參數,如果不是,只要它。有沒有一種簡潔的方式來傳遞可選參數而不需要進入If語句?

回答

5

我很驚訝沒有人提出splatting$PSBoundParameters自動變量。

$PSBoundParameters是一個散列表,其中包含傳遞給該命令的所有參數參數。

只需將$FieldSeparator參數重命名爲$Delimiter即可。 如果需要,可以提供FieldSeparator名作爲參數別名:

param(
     [Alias('FieldSeparator')] 
     [String]$Delimiter=",", 
     [String[]]$Header 
) 

$input | ConvertFrom-Csv @PSBoundParameters | ConvertTo-JSON 

如果執行調用函數/腳本時省略了-Header參數,它會也可以從通話省略ConvertFrom-Csv

+0

++ - 毫無疑問,最簡單和最優雅的解決方案。 – mklement0

+0

它是優雅的。但是它強制這兩個函數使用同名的參數,如果@ PSBoundParameters包含被調用的函數不接受的附加參數,則不起作用。 – Gildor

+0

@Gildor'ConvertFrom-Csv'支持Common Parameters,所以在這種情況下不應該是一個問題:-)如果你有一個包含* additional *參數的包裝函數,你總是可以克隆'$ PSBoundParameters'並修改條目在濺出之前 –

1

不幸的是沒有。您必須利用if聲明。這種將工作布爾或開關值,例如:

param(
     [String]$FieldSeparator=",", 
     [String[]]$Header, 
     [switch]$Compress   
) 

$input | ConvertFrom-Csv -Delimiter $FieldSeparator | ConvertTo-JSON -Compress:$Compress 

注意:您可以使用MyInvocation.BoundParameter和潑灑做,但我懷疑這會令你的腳本更易讀。

+0

他試圖刪除標題? – 4c74356b41

+0

他想排除標題參數,如果它沒有傳遞給腳本 –

+0

我想我真的不明白他在做什麼;) – 4c74356b41

2

馬丁·布蘭德是正確的,你必須使用if,但我會建議結合其與splatting這樣你只會讓你的通話一次:

param(
     [String]$FieldSeparator=",", 
     [String[]]$Header 
) 

$params = @{ 
    Delimeter = $FieldSeparator 
} 
if ($Header) { 
    $params.Header = $Header 
} 

$input | ConvertFrom-Csv @params | ConvertTo-JSON 
0

好的,根據Martin的反饋,我有另一種選擇。這在參數名稱匹配時工作良好:

param(
    $Path, 
    $Delimiter, 
    $Header 
) 

$params = @{} 
$MyInvocation.BoundParameters.Keys | Where {$_} | 
    % {$params.Add($_, (Get-Variable $_).Value)} 

Import-Csv @params