【问题标题】:Create a function with optional call variables创建一个带有可选调用变量的函数
【发布时间】:2012-11-21 04:08:33
【问题描述】:

有没有办法在 PowerShell 函数中创建参数,您必须调用它才能考虑它?

commandlet 给出的一个例子(粗体是我想做的):

Invoke-Command -computername Server01 -Scriptblock {...}

这是我想用函数做的一个例子

Function DoStuff($computername, -arg2, -domain $domain)
    Test-parameter(-domain) if (-domain -eq $true) {
        use $domain
    }
    Else {
        $domain = "Domain1"
    }
    test-parameter($arg2) {
        if ($arg2 -eq $true) {
            Do something
        }
        else {
            Do the opposite
        }
    }

总之:

如果存在“-arg2”,我希望脚本中发生一些事情。如果“-Domain”存在并且有一个参数,我希望使用它而不是 set 参数。

【问题讨论】:

    标签: function powershell windows-7 parameters


    【解决方案1】:

    不确定我是否正确理解了这个问题。

    据我所知,您希望能够为 Domain 分配一个值(如果它为 null),以及检查是否提供了 $args2 并根据该值执行某个代码?

    我更改了代码以重新组合上述假设。

    Function DoStuff($computername, $arg2, $domain)
    {
        if($domain -ne $null)
        {
            $domain = "Domain1"
        }
    
        if($arg2 -eq $null)
        {
        }
        else
        {
        }
    }
    
    DoStuff -computername "Test" -arg2 "" -domain "Domain2"
    DoStuff -computername "Test" -arg2 "Test"  -domain ""
    DoStuff -computername "Test" -domain "Domain2"
    DoStuff -computername "Test" -arg2 "Domain2"
    

    这有帮助吗?

    【讨论】:

      【解决方案2】:

      Powershell为常用参数场景提供了很多内置支持,包括强制参数、可选参数、“开关”(又名标志)参数和“参数集”。

      默认情况下,所有参数都是可选的。最基本的方法是简单地检查每个$null,然后从那里实现你想要的任何逻辑。这基本上就是您在示例代码中已经显示的内容。

      如果您想了解 Powershell 可以为您提供的所有特殊支持,请查看以下链接:

      about_Functions

      about_Functions_Advanced

      about_Functions_Advanced_Parameters

      【讨论】:

      • 请注意[string]参数是用空字符串初始化的,而不是$null。必须使用 -eq '' 对其进行测试
      • @helb 是正确的。但是,我发现使用静态 .NET 字符串方法 [string]::IsNullOrEmpty($stringName) 验证方法字符串参数更容易。
      【解决方案3】:

      我认为您的问题不是很清楚,此代码假定如果您要包含 -domain 参数,它总是“命名”(即 dostuff computername arg2 -domain domain);这也使得 computername 参数是强制性的。

      Function DoStuff(){
          param(
              [Parameter(Mandatory=$true)][string]$computername,
              [Parameter(Mandatory=$false)][string]$arg2,
              [Parameter(Mandatory=$false)][string]$domain
          )
          if(!($domain)){
              $domain = 'domain1'
          }
          write-host $domain
          if($arg2){
              write-host "arg2 present... executing script block"
          }
          else{
              write-host "arg2 missing... exiting or whatever"
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-20
        • 2016-06-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        相关资源
        最近更新 更多