Function Powershell函数在仅显式返回一个参数时返回所有参数

Function Powershell函数在仅显式返回一个参数时返回所有参数,function,powershell,return,Function,Powershell,Return,我试图通过创建一些函数来简化我编写的脚本,但是,我似乎无法让它们按我想要的方式工作 示例函数将接受2个或多个参数,但仅返回1个值。当我这样做时,它会返回每个值,在本例中是传递给函数的所有参数(本例中为2) 我从一些研究中了解到,Powershell返回的值比显式调用的要多,这有点令人困惑,因此我尝试了一些建议,将这些其他值分配给$null,但没有效果 我的函数及其运行结果如下所示: function postReq($path, $payload) { Write-Host $path

我试图通过创建一些函数来简化我编写的脚本,但是,我似乎无法让它们按我想要的方式工作

示例函数将接受2个或多个参数,但仅返回1个值。当我这样做时,它会返回每个值,在本例中是传递给函数的所有参数(本例中为2)

我从一些研究中了解到,Powershell返回的值比显式调用的要多,这有点令人困惑,因此我尝试了一些建议,将这些其他值分配给
$null
,但没有效果

我的函数及其运行结果如下所示:

function postReq($path, $payload) {
    Write-Host $path
}

postReq($url, $params)

> [path value (is correct)] [$payload (shouldn't be included here)]

您调用函数的语法在语义上不正确。你写道:

postReq($url, $params)
但这在PowerShell中不是正确的语法。(在语法上有效,但在语义上无效。)在PowerShell中,调用函数时不使用
,也不使用
,如下所示:

postReq $url $params
当您使用
()
时,您将向函数传递一个参数。

解决方案 您并没有按照自己的想法调用函数。调用PowerShell函数时不带括号,参数分隔符为空白,而不是逗号。您的函数调用应该如下所示:

postReq $url $params
使用传统的类似C的语法有什么错? 像上面那样将其称为
postReq($url,$params)
会产生两种不希望出现的后果:

  • 括号表示一个子表达式,括号中的代码将首先在外部代码之前运行,并被视为单个参数。如果您熟悉求解代数方程,则运算顺序与PEMDAS中的相同-首先是括号

  • Powershell函数的参数分隔符是空格(
    ),而不是逗号(
    )。但是,逗号在Powershell语法中确实有某种含义——它们表示集合<代码>[1,2,3,4]在功能上与Powershell中的
    1,2,3,4
    相同。在上面的示例中,您正在将两个参数滚动到单个数组参数
    [$url,$params]
    ,流写入cmdlet将使用
    作为呈现字符串中的分隔符进行数组联接

  • 但是对象实例和静态方法呢? 这可能会让一些人感到困惑,因为对象实例和类(RE:static)方法是用传统的类似C#的语法调用的,在这种语法中,确实需要括号来表示参数值,逗号是分隔符。例如:

    ([DateTime]::Now).ToString()
    
    返回当前本地时间,并对返回的
    DateTime
    对象运行ToString()方法。如果使用如下所示的其中一个重载,则应使用
    分隔每个参数,并且无论是否需要传入参数,都必须指定外圆括号:

    OverloadDefinitions
    -------------------
    string ToString()
    string ToString(string format)
    string ToString(System.IFormatProvider provider)
    string ToString(string format, System.IFormatProvider provider)
    string IFormattable.ToString(string format, System.IFormatProvider formatProvider)
    string IConvertible.ToString(System.IFormatProvider provider)
    
    如果省略上面空参数重载上的括号,则会得到前面显示重载定义的输出,这与无参数调用函数时的行为不同

    这有点奇怪,但我记得在任何编程语言中,函数和方法都是相似的,但不同的,在Powershell中也没有什么不同,只是函数和方法不像在其他语言中那样相似。我发现一个很好的经验法则是:

    使用C#语法调用方法,使用shell语法调用函数


    绝对是这样。非常感谢。我来自Ruby和Javascript,所以这样做似乎很陌生。谢谢你把它清理干净@我不认为这是重复的。虽然这个问题引出了“如何在Powershell中向函数传递多个参数”的类似答案,但这不是用户所问的问题,事实上,这是Powershell有多少新用户感知函数调用如何工作(特别是因为它是方法调用如何工作的)。@BenderSegreatest,给出了OP接受的答案,这看起来与链接帖子中的混淆完全相同:错误地期望
    postReq($url,$params)
    传递两个不同的参数,而不是实际传递的参数:一个数组值的参数(其两个元素都以
    Write Host
    打印到控制台,空格分隔)。