gpt4 book ai didi

powershell - 函数中不使用参数的默认值

转载 作者:行者123 更新时间:2023-12-03 00:24:09 24 4
gpt4 key购买 nike

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

Param(
[string]$MyWord
)

function myfunc([string] $MyWord) {
Write-Host "$MyWord"
}
myfunc @PSBoundParameters

这就是我执行它的方式:
PS C:\> .\test.ps1 -MyWord 'hello'hello

All fine. But I want to set a default value if -MyWord isn't specified.I tried this:

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

function myfunc([string] $MyWord) {
Write-Host "$MyWord"
}
myfunc @PSBoundParameters

但是我的脚本的输出只是空的。当我没有描述我的参数时,它什么也没打印。 (如果我指定了参数,它只显示“你好”)。
我也试过:
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 '你好'
你好

PS C:\> .\test.ps1
你好

最佳答案

自动变量 $PSBoundParameters ,顾名思义,只包含绑定(bind)参数,其中 bound 表示调用者提供了一个实际值 .

因此,一个参数默认值不符合绑定(bind)条件相关参数,所以 $MyWord其默认值为 'hi'不成为 $PSBoundParameters 的一部分.

备注 :可以说,具有默认值的参数也应被视为已绑定(bind)(它受其默认值约束,而不是由调用者提供的值绑定(bind))。无论哪种方式,拥有一个包含默认值的自动变量会很方便,以便能够简单而全面地传递参数 .已将建议提交到 PowerShell GitHub 存储库 here .

解决方法

  • 以下解决方案假设您想要 通过 传递默认值,并且不想简单地复制函数 myfunc 中的默认值(如 Ansgar Wiecher's helpful answer 中所示),因为这会产生维护负担。
  • 关于函数语法 : 以下两种形式是等价的,但出于一致性和可读性的考虑,您可能更喜欢后者。
  • function myfunc([string] $MyWord = 'hi') { ... }(...) 内的参数声明在函数名之后。
  • function myfunc { param([string] $MyWord = 'hi') ... }param(...) 中的参数声明 block 在函数体内。


  • 一个 简单修复将默认值显式添加到 $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

    一般实现你想要的,你必须使用反射(内省(introspection)):
    Param(
    [alias('foop')]
    [string]$MyWord = 'hi'
    )

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

    # Add all unbound parameters that have default values.
    $boundAndDefaultValueParams = $PSBoundParameters
    foreach($paramName in $MyInvocation.MyCommand.Parameters.Keys) {
    if (-not $boundAndDefaultValueParams.ContainsKey($paramName)) {
    $val = Get-Variable $paramName -ValueOnly
    if ($null -ne $val) { $boundAndDefaultValueParams.Add($paramName, $val) }
    }
    }

    myfunc @boundAndDefaultValueParams

    关于powershell - 函数中不使用参数的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42677229/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com