2016-11-15 67 views
0

我想在給定一個空字符串時使用默認值。我希望更優雅的東西,然後有if語句來檢查$Var是否爲空,並將其設置爲默認值。任何人都知道這是否可以實現?還需要支持PowerShell版本2.0。如何在powershell函數中給出空字符串時使用默認值?

下面是我試圖完成的一個片段。給定一個空字符串,我希望它打印「VAR:DEFAULT」。

$ErrorActionPreference = "Stop" 

function Test-Function(
    [parameter(Mandatory = $true)][string] $Var = "DEFAULT" 
) { 
    # If Mandatory is set to $true an error is thrown 
    # "Cannot bind argument to parameter 'password' because it is an empty string." 
    # When Mandatory is set to $false, $Var is an empty string rather than "DEFAULT" 

    Write-Host "Var: $Var" 
} 

$EmptyString = "" 
Test-Function -Var $EmptyString 

回答

2

有沒有優雅的方式來做到這一點。至少沒有內置的方式來做到這一點。你可以只驗證該字符串不爲空或空:

function Test { 
    Param (
     [ValidateNotNullOrEmpty()] 
     [String] 
     $String = 'DEFAULT' 
    ) 

    Write-Host -Object "String: $String" 
} 
+0

這不使用默認值。拋出異常,指示參數爲null或空。而不是拋出這個異常,我想要使用默認值。 –

+1

「沒有優雅的方式來做到這一點,至少沒有內建的方法可以這樣做,你可以驗證字符串不是空或空的」...與'[ValidateNotNullOrEmpty()]' –

0

自己的函數中使用此:

If (!($var)) {$var = "DEFAULT"} #basically, if $var doesn't exist, create it 

PS。我剛剛用Mandatory = $ false對其進行了測試,它按預期工作,不知道爲什麼它不適用於您,當mandatory = $ false時它會執行什麼操作?

+0

當'強制性= $ FALSE'輸出只是'VAR:'當我想到'VAR:DEFAULT' –

+0

對我來說,它就像我說的那樣完美。但無論如何,我的答案符合你的目的,試試吧 – 4c74356b41

1

var爲空字符串,因爲你明確地傳遞一個空字符串。空字符串仍然是對象,不爲空。您對Test-Function -Var $ EmptyString的調用無法爲您提供您正在查找的輸出,因爲您將等於空字符串,並將null指定爲.Net中的false。您的聲明「當強制性設置爲$ false時,$ Var是一個空字符串而不是'DEFAULT'」是正確的,因爲您傳遞了一個空字符串,因此從不調用值「DEFAULT」的賦值。

您可以刪除Mandatory = $ true,在這種情況下顯示「默認」值當參數未通過時

function Test-Function(
    [parameter(Mandatory = $false)] 
    [string] $Var = "DEFAULT" 
){ 
    Write-Host "Var: $Var" 
} 
Test-Function 

這會按預期生成Var: DEFAULT

無論參數是否爲強制參數,如果傳遞一個空字符串,$ Var =「Default」的賦值永遠不會到達,因爲$ Var的值爲'',而empty實際上是一個字符串。

Test-Function '' 

這會產生無功:這可能看起來像錯誤的,但它輸出的空字符串,你告訴它。

如果你想允許當參數不通過使用強制性= $假,正如我上面沒有指定一個默認值將被分配一個默認值。如果你想測試傳遞的值,並且如果它是一個空字符串,則分配一個默認值,你應該在函數的begin塊中做這個。

function Test-Function(
    [parameter(Mandatory = $false)] 
    [string] $Var = "DEFAULT" 
){ 
    begin{if([String]::IsNullOrWhiteSpace($Var)){$Var="DEFAULT"}} 
    process{Write-Host "Var: $Var"} 
    end{} 
} 
Test-Function 
Test-Function '' 
Test-Function 'SomeValue' 

這生成我認爲是你所期待的下列情況:

Var: DEFAULT 
Var: DEFAULT 
Var: SomeValue 
+0

謝謝你的迴應。所以我想如果我總是想嘗試傳入一個'$ Var',那麼我想要做的事是不可能的,而不使用'if'語句。 –

相關問題