PowerShell中param和函数语法之间的差异



在PowerShell中,如果我使用param语法创建闭包,我可以传递一个参数:

$hello = { param($name) "Hello $name"}
& $hello "World!"
>hello.ps1
Hello World!

当我尝试使用函数语法时,我遇到了麻烦:

function hello($n) { { "Hello $n" }.GetNewClosure() }
$doit = hello
& $doit "World!"
>functionclosure.ps1
Hello 

我通过早些时候给出的参数解决了这个问题:

function hello($n) { {"Hello $n"}.GetNewClosure()  }
$doit = hello "World"
& $doit
>functionclosure2.ps1
Hello World

有没有一种方法可以将参数从&呼叫接线员?

是否有方法将参数从&呼叫接线员?

调用(也称为调用或&(运算符通常用于执行字符串中的内容,当存在长文件路径或名称中有空格的路径时,或者当我们动态构建要执行的字符串时,我们会执行此操作。

现在,在这种情况下,使用GetNewClosure()会更改一个函数,以返回一个脚本块作为输出类型。必须使用Call运算符调用该Scriptblock,因此这是Call operator的有效用法。

回到你的问题,是的,你可以使用Paradishesion控制执行顺序,并将参数传递给一个函数,该函数从调用行返回闭包,如下所示:

& (hello stephen)

然而,这在操作中相当令人困惑,因为闭包保持着自己独立的范围,在十多年的企业自动化项目中,我从未见过它们被使用。沿着这条路走下去可能会更加混乱。

也许一个更简单的方法可能是:

function hello($name) { "WithinFunction: Hello $name"}
$do = 'hello "world"'
PS> $do
hello "world"
#invoke
PS> invoke-expression $do
WithinFunction: Hello world

在PowerShell中实现闭包的人自己对闭包的补充阅读。https://devblogs.microsoft.com/scripting/closures-in-powershell/

Jeroen Mostert写了这篇评论:

您已经编写了一个函数,该函数接受一个参数,然后使用该参数创建一个闭包。您似乎想要一个返回带参数的闭包的函数,但这与您的第一个示例相同,并且

function hello { { param($n) "Hello $n"} } 

会这么做的。你可以调用它作为

& (hello) "world"

另一方面,如果你想有一个函数作为闭包,你可以调用

${function:hello} 

会这样做,即

function hello($n) { "Hello $n" }; 
$doit = ${function:hello}; 
& $doit "World"

最新更新