将可选参数传递给子例程而不实例化它们
Passing optional parameters to subroutines without instantiating them
我有一个提示用户输入(网址、用户名和密码等)并验证这些输入或再次提示用户的脚本。
现在我希望能够调用此脚本,同时还在命令行上提供其中一些参数,方法是将它们作为可选参数,并将它们传递给原始子例程。但是,在脚本的范围内,我可以测试参数是否由 $PSBoundParameters.ContainsKey('a')
提供,但是一旦我将参数 $a
(可能未提供)传递给函数,同样测试将始终 return $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
时被实例化了,有没有更多的 elegant/correct 方法来处理这个?
使用@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
我有一个提示用户输入(网址、用户名和密码等)并验证这些输入或再次提示用户的脚本。
现在我希望能够调用此脚本,同时还在命令行上提供其中一些参数,方法是将它们作为可选参数,并将它们传递给原始子例程。但是,在脚本的范围内,我可以测试参数是否由 $PSBoundParameters.ContainsKey('a')
提供,但是一旦我将参数 $a
(可能未提供)传递给函数,同样测试将始终 return $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
时被实例化了,有没有更多的 elegant/correct 方法来处理这个?
使用@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