Powershell 函数中未使用参数的默认值

Powershell 函数中未使用参数的默认值,powershell,parameter-passing,Powershell,Parameter Passing,我有一个非常基本的PowerShell脚本: Param( [string]$MyWord ) function myfunc([string] $MyWord) { Write-Host "$MyWord" } myfunc @PSBoundParameters 我是这样执行的: PS C:\> .\test.ps1 -MyWord 'hello' hello 但是我的脚本的输出只是空的。当我没有描述我的参数时,它没有打印任何内容。(如果我指定了参数,它只显示“hello”

我有一个非常基本的PowerShell脚本:

Param(
    [string]$MyWord
)

function myfunc([string] $MyWord) {
    Write-Host "$MyWord"
}
myfunc @PSBoundParameters
我是这样执行的:

PS C:\> .\test.ps1 -MyWord 'hello' hello 但是我的脚本的输出只是空的。当我没有描述我的参数时,它没有打印任何内容。(如果我指定了参数,它只显示“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 PS C:\>。\test.ps1-MyWord'hallo' 你好 PS C:\>。\test.ps1 hi如果要使用“参数”,请将其包含在函数中,如下所示:

function myfunc {

    Param(
        [string]$MyWord='hi'
    )

    Write-Host "$MyWord" 
}
如果要使用“Param”将其括在函数中,如下所示:

function myfunc {

    Param(
        [string]$MyWord='hi'
    )

    Write-Host "$MyWord" 
}

自动变量
$PSBoundParameters
顾名思义,只包含绑定参数,其中绑定表示调用方提供了实际值

因此,参数的默认值不符合绑定相关参数的条件,因此默认值为
'hi'
$MyWord
不会成为
$PSBoundParameters
的一部分

注意:可以说,具有默认值的参数也应被视为绑定(它由其默认值绑定,而不是由调用方提供的值绑定)。无论哪种方式,都可以方便地使用包含默认值的自动变量,以便能够简单而全面地传递参数。建议已提交到PowerShell GitHub存储库


权变措施
  • 以下解决方案假定您希望通过传递默认值,而不希望简单地复制函数
    myfunc
    中的默认值(如中所示),因为这会造成维护负担

  • 关于函数语法:以下两种形式是等效的,尽管出于一致性和可读性,您可能更喜欢后者

    • 函数myfunc([string]$MyWord='hi'){…}

      函数名后的
      (…)
      内的参数声明
    • 函数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

若要实现您通常想要的,您必须使用反射(内省):


自动变量
$PSBoundParameters
顾名思义,只包含绑定参数,其中绑定表示调用方提供了实际值

因此,参数的默认值不符合绑定相关参数的条件,因此默认值为
'hi'
$MyWord
不会成为
$PSBoundParameters
的一部分

注意:可以说,具有默认值的参数也应被视为绑定(它由其默认值绑定,而不是由调用方提供的值绑定)。无论哪种方式,都可以方便地使用包含默认值的自动变量,以便能够简单而全面地传递参数。建议已提交到PowerShell GitHub存储库


权变措施
  • 以下解决方案假定您希望通过传递默认值,而不希望简单地复制函数
    myfunc
    中的默认值(如中所示),因为这会造成维护负担

  • 关于函数语法:以下两种形式是等效的,尽管出于一致性和可读性,您可能更喜欢后者

    • 函数myfunc([string]$MyWord='hi'){…}

      函数名后的
      (…)
      内的参数声明
    • 函数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

若要实现您通常想要的,您必须使用反射(内省):


仅当您实际传递一个值时,参数才会被绑定,这意味着参数的默认值不会显示在
$PSBoundParameters
中。如果要将脚本参数传递到函数中,必须复制函数参数集中的脚本参数集:

Param(
    [string]$MyWord = 'hi'
)

function myfunc([string]$MyWord = 'hi') {
    Write-Host "$MyWord" 
}

myfunc @PSBoundParameters

仅当您实际传递一个值时,参数才会被绑定,这意味着参数的默认值不会显示在
$PSBoundParameters
中。如果要将脚本参数传递到函数中,必须复制函数参数集中的脚本参数集:

Param(
    [string]$MyWord = 'hi'
)

function myfunc([string]$MyWord = 'hi') {
    Write-Host "$MyWord" 
}

myfunc @PSBoundParameters
很简单的办法是,

function myfunc([string]$MyWord = "hi") {
Write-Output $MyWord
}
很简单的办法是,

function myfunc([string]$MyWord = "hi") {
Write-Output $MyWord
}
param(…)
被OP正确地用于为脚本声明参数。在函数内部,您可以在
param(…)
语法(如答案中所示)和OP选择的
myfunc([string]$MyWord)
变量之间进行选择-没有区别。我认为,在函数中为
$MyWord
复制脚本的默认值正是OP想要避免的。OP正确地使用
param(…)
来声明脚本的参数。在函数内部,您可以在
param(…)
语法(如答案中所示)和OP选择的
myfunc([string]$MyWord)
变量之间进行选择-没有区别