如何创建一个可以接收空值或非空值的输入参数

时间:2017-11-23 15:33:06

标签: powershell input arguments parameter-passing

我正在尝试创建将接收参数作为日志文件路径的函数 我希望此参数能够接收字符串路径或用作[switch],不带任何参数。

我想要这样做的原因是因为我需要涵盖三个场景,我只想用一个参数来做:     1.参数未通过
    2.参数以空参数
传递     3.参数与参数

一起传递

这是一个演示我想要的脚本:

function myFunc(){
    param(
       $LogFile = $null
    )

    # 1. PS > myFunc 
    if($LogFile -eq $null){  
    }

    # 2. PS > myFunc -LogFile
    if($LogFile -eq ""){
    }

    # 3. PS > myFunc -LogFile "C:\tmp\log.txt"
    else{ 
    }      
}

是否可以创建可以接收空值和非空值的输入参数?

当我运行myFunc -LogFile时,我收到错误:

myFunc : Missing an argument for parameter 'LogFile'. Specify a parameter of type 'System.Object' and try again.
At line:1 char:8
+ myFunc -LogFile
+        ~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [myFunc], ParameterBindingException
    + FullyQualifiedErrorId : MissingArgument,myFunc

这是因为它未设置为[switch],如果我添加[switch],则无法运行myFunc -LogFile c:\tmp\file.txt

myFunc : A positional parameter cannot be found that accepts argument 'C:\tmp\file.txt'.
At line:1 char:1
+ myFunc -LogFile C:\tmp\file.txt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [myFunc], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,myFunc

我还尝试使用[AllowNull()][AllowEmptyString()],但他们仍需要一些字符 有关参数的更多信息可以找到{{3}}。

4 个答案:

答案 0 :(得分:1)

我不认为你可以有一个像开关一样的参数以及像字符串输入一样。这是因为如果你试图像开关一样使用它,它会抱怨你没有传递任何输入:

  

myFunc:缺少参数' LogFile'的参数。指定一个   类型参数' System.Object'然后再试一次。

获得您正在寻找的行为的一种方法是将$LogFile作为开关,然后使用第二个参数来获取字符串(您不需要明确地使用该字符串)声明为输入将通过其调用的顺序转到此参数 - 给予它传递给-LogFile的印象。这是一个例子:

function myFunc{
    param(
       [switch]$LogFile,
       [string]$LogPath = $null
    )

    # 1. PS > myFunc 
    if ($LogFile -eq $false){
        "Function used without parameter"  
    }

    # 2. PS > myFunc -LogFile
    elseif ($LogFile -eq $true -and -not $LogPath){
        "Parameter used like a switch"
    }

    # 3. PS > myFunc -LogFile "C:\tmp\log.txt"
    else{
        "Parameter was $LogPath"     
    }      
}

myfunc
myfunc -logfile
myfunc -logfile "C:\tmp\log.txt"

老实说,虽然在这种情况下您想要做的所有事情都有默认路径,但scernario 2并不是必需的。在这种情况下,你可以在param()块中给$ LogPath一个默认值。对参数的实际内容进行误导也可能不是一个好主意(尽管get-help文档语法块无论如何都会暴露出来。)

答案 1 :(得分:1)

接受$LogFile作为switch参数,然后如果它存在,只需将它的类型转换为字符串值,并使用以下参数的值填充它(如果存在):

   param(
       [switch]
       $LogFile
   )

 if($LogFile)
 {
    #We neeed to change the variable type, so remove it
    Remove-Variable -Name "LogFile"
    #The remaining arguments are placed in $args array.
     if($args.Count -gt 0)
     {

        $LogFile = [String]$args[0]
     }
     else {
        $LogFile = [String]""
     }
 }
 # 1. PS > myFunc
 else {
    "# 1. PS > myFunc "
}
# 2. PS > myFunc -LogFile
if($LogFile -eq ""){
        "LogFile is empty"
}

# 3. PS > myFunc -LogFile "C:\tmp\log.txt"
elseif ($LogFile -is [String]){ 
    "logFile is $logFile"
}      

答案 2 :(得分:-2)

function cookieMonster($ChocolateChipCookie){
   if ([string]::IsNullOrEmpty($chocolateChipCookie)){
         write-host "Hey wheres my Cookies! "
   }
   else {
         write-host "MMMMM COOKIES! NOM NOM NOM"
   }       
}

cookieMonster -ChocolateChipCookie C:\cookiejar\cookie.txt

答案 3 :(得分:-2)

这个答案的灵感来自上面的传奇Mark Wragg:

function cookieMonster{
    param(

       [switch] $ChocolateChipCookie,
        [string] $Crumbs = $null
    )

# The function without parameters
if($ChocolateChipCookie -eq $false){
    write-host "no cookies;("
}

# The parameter is not passed
elseif ($ChocolateChipCookie -eq $true -and -not $Crumbs) {
    Write-Host "Aw just crumbs!"
}
# The parameter is passed with argument
else {
    write-host "MMMMM COOKIES! NOM NOM NOM"
}


}

cookieMonster  -ChocolateChipCookie  C:\cookiejar\cookie.txt

$ ChocolateChipCookie被定义为开关参数。 然后将switch参数的值创建为名为$ crumbs的字符串参数。

if块检查是否在没有开关的情况下调用该函数并写入消息。

elseif块检查是否使用没有值的开关调用了该函数。

如果不满足上述条件,则else块会写入消息。