代码之家  ›  专栏  ›  技术社区  ›  Ran Lottem

将可选参数传递给子例程,而不实例化它们

  •  1
  • Ran Lottem  · 技术社区  · 7 年前

    我有一个脚本,提示用户输入(网址、用户名和密码等),并验证这些输入或再次提示用户。

    $PSBoundParameters.ContainsKey('a') ,但一旦我传递了参数 $a (可能没有提供)对于函数,始终会返回相同的测试 $True .

    function main {
        param (
            [string]$a
        )
        if ($PSBoundParameters.ContainsKey('a')) {
            "main - a is $a"
        }
        else {
            "main - didn't get a"
        }
        getStr $a
    }
    
    function getStr {
        param (
            [string]$a
        )
        if ($PSBoundParameters.ContainsKey('a')) {
            "getStr - a is $a"
        }
        else {
            "getStr - didn't get a"
        }
    }
    

    输入:

    main
    
    main "hello"
    

    预期输出:

    main - didn't get a
    getStr - didn't get a
    
    main - a is hello
    getStr - a is hello
    

    main - didn't get a
    getStr - a is
    
    main - a is hello
    getStr - a is hello
    

    我猜是这样的 $a getStr $a ,有没有更优雅/正确的方法来处理这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   G42    7 年前

    使用 @PSBoundParameters 。我修改了你的函数,以便可以将其作为脚本运行。

    密码

    param (
        [string]$a
    )
    
    function main {
        param (
            [string]$a
        )
        if ($PSBoundParameters.ContainsKey('a')) {
            "main - a is $a"
        }
        else {
            "main - didn't get a"
        }
        getStr @PSBoundParameters
    }
    
    function getStr {
        param (
            [string]$a
        )
        if ($PSBoundParameters.ContainsKey('a')) {
            "getStr - a is $a"
        }
        else {
            "getStr - didn't get a"
        }
    }
    main @PSBoundParameters
    

    输出

    PS C:\> .\code.ps1 -a string
    main - a is string
    getStr - a is string
    PS C:\> .\code.ps1
    main - didn't get a
    getStr - didn't get a