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

Shell 将可选参数传递给子例程而不实例化它们,shell,powershell,scripting,windows-scripting,Shell,Powershell,Scripting,Windows Scripting,我有一个脚本,提示用户输入(网址、用户名和密码等),并验证这些输入或再次提示用户 现在,我希望能够调用这个脚本,同时在命令行上提供其中一些参数,方法是将它们作为可选参数,并将它们传递给原始子例程。但是,在脚本的范围内,我可以测试参数是否随$PSBoundParameters.ContainsKey('a')一起提供,但一旦我将参数$a(可能未提供)传递给函数,相同的测试将始终返回$True 示例代码: function main { param ( [string]$a

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

现在,我希望能够调用这个脚本,同时在命令行上提供其中一些参数,方法是将它们作为可选参数,并将它们传递给原始子例程。但是,在脚本的范围内,我可以测试参数是否随
$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
输入:

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
预期输出:

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
实际输出:

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
时实例化的,有没有更优雅/正确的方法来处理这个问题?

使用
@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

谢谢,这就解决了前面提到的问题。如果可以的话-如果我可能会得到几个参数,每个子例程只需要检查一个参数呢?为了将来的参考-我自己测试了这个,我只需将飞溅的(
@
PSBoundVariables
发送到每个函数,它会检查它想要的键。