我有一个非常基本的PowerShell脚本:
Param(
[string]$MyWord
)
function myfunc([string] $MyWord) {
Write-Host "$MyWord"
}
myfunc @PSBoundParameters
这就是我执行它的方式:
PS C:\> .\test.ps1 -MyWord 'hello' hello
一切都很好。但是如果未指定-MyWord
,我想设置默认值。
我试过这个:
Param(
[string]$MyWord='hi'
)
function myfunc([string] $MyWord) {
Write-Host "$MyWord"
}
myfunc @PSBoundParameters
但是我的脚本输出只是空的。当我没有描述我的参数时,它什么都没打印。 (如果我指定参数,它只显示'hello')。 我也尝试过:
Param(
[string]$MyWord
)
function myfunc([string] $MyWord) {
[string]$MyWord='hi'
Write-Host "$MyWord"
}
myfunc @PSBoundParameters
但是输出当然总是“喜欢”而且从不“打招呼”。即使我使用参数-MyWord 'hello'
有人可以解释我做错了吗?
当我没有使用该功能时,它按预期工作:
Param(
[string]$MyWord='hi'
)
Write-Host $MyWord
输出:
PS C:\> .\test.ps1 -MyWord 'hallo' hallo PS C:\> .\test.ps1 hi
答案 0 :(得分:4)
自动变量 $PSBoundParameters
,顾名思义,仅包含绑定参数,其中 绑定表示实际值由来电者 提供。
因此,参数 默认值 不符合绑定 相关参数,因此{{1默认值为$MyWord
,不成为'hi'
的一部分。
注意:可以说,具有默认值的参数也应该被视为绑定(它由默认值绑定,而不是由调用者提供的值绑定)。无论哪种方式,使用包含默认值的自动变量也会很方便,以便能够简单而全面地传递参数。已向PowerShell GitHub存储库here提交了一条建议。
以下解决方案假设您希望传递默认值至 ,并且不希望只是重复函数$PSBoundParameters
中的默认值(如Ansgar Wiecher's helpful answer所示),因为这会产生维护负担。
关于功能语法 :以下两种形式是等效,但您可能更喜欢后者的一致性和可读性。< / p>
myfunc
function myfunc([string] $MyWord = 'hi') { ... }
内的参数声明。(...)
function myfunc { param([string] $MyWord = 'hi') ... }
块内的参数声明。 简单修复将显式添加默认值param(...)
:
$PSBoundParameters
要实现您想要的一般,,您必须使用反射(内省):
Param(
[string]$MyWord = 'hi'
)
function myfunc ([string] $MyWord){
Write-Host "$MyWord"
}
# Add the $MyWord default value to PSBoundParameters.
# If $MyWord was actually bound, this is effectively a no-op.
$PSBoundParameters.MyWord = $MyWord
myfunc @PSBoundParameters
答案 1 :(得分:3)
只有在您实际传递一个值时才绑定参数,这意味着参数的默认值不会显示在$PSBoundParameters
中。如果要将脚本参数传递给函数,则必须复制函数参数集中的脚本参数集:
Param(
[string]$MyWord = 'hi'
)
function myfunc([string]$MyWord = 'hi') {
Write-Host "$MyWord"
}
myfunc @PSBoundParameters
如果以相同的方式定义两个参数集,维护这样的事情会更容易,所以我也将函数参数定义放在Param()
块中:
Param(
[string]$MyWord = 'hi'
)
function myfunc {
Param(
[string]$MyWord = 'hi'
)
Write-Host "$MyWord"
}
答案 2 :(得分:0)
如果你想使用“ Param ”将它包含在这样的函数中:
function myfunc {
Param(
[string]$MyWord='hi'
)
Write-Host "$MyWord"
}
答案 3 :(得分:0)
非常简单的方法是,
function myfunc([string]$MyWord = "hi") {
Write-Output $MyWord
}