如何在powershell函数中给出空字符串时使用默认值?

问题描述:

我想在给定一个空字符串时使用默认值。我希望更优雅的东西,然后有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 

有没有优雅的方式来做到这一点。至少没有内置的方式来做到这一点。你可以只验证该字符串不为空或空:

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

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

这不使用默认值。抛出异常,指示参数为null或空。而不是抛出这个异常,我想要使用默认值。 –

+1

“没有优雅的方式来做到这一点,至少没有内建的方法可以这样做,你可以验证字符串不是空或空的”...与'[ValidateNotNullOrEmpty()]' –

自己的函数中使用此:

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

PS。我刚刚用Mandatory = $ false对其进行了测试,它按预期工作,不知道为什么它不适用于您,当mandatory = $ false时它会执行什么操作?

+0

当'强制性= $ FALSE'输出只是'VAR:'当我想到'VAR:DEFAULT' –

+0

对我来说,它就像我说的那样完美。但无论如何,我的答案符合你的目的,试试吧 – 4c74356b41

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'语句。 –