函数

时间:2017-03-08 16:52:40

标签: powershell parameter-passing

我有一个非常基本的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

4 个答案:

答案 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
}