如何从PowerShell函数返回一个值,只返回一个值?

我从这个StackOverflow question学到了,从C#的返回语义来看,PowerShell返回语义是不同的.从上述问题引用:

PowerShell has really wacky return semantics – at least when viewed from a more traditional programming perspective. There are two main ideas to wrap your head around: All output is captured, and returned.
The return keyword really just indicates a logical exit point.

我们来看这个例子:

function Calculate
{
   echo "Calculate"
   return 11
}

$result = Calculate

如果你回应$结果,你会发现有些事情是不正确的.你会期望这样:

11

但事实上,你实际看到的是不同的:

Calculate
11

因此,您不需要仅返回预期的返回值,而是实际返回一个数组.

你可以摆脱回声语句,而不会污染返回值,但是如果你从函数中调用另一个函数,它会回显一些东西,那么你再次遇到麻烦.

我的问题是,我如何编写一个PowerShell函数,只返回一件事.如果内置的PowerShell函数只返回一个值,为什么我不能这样做?

我现在使用的解决方法,我很想摆脱:

function Calculate
{
   #Every function that returns has to echo something
   echo ""
   return 11
}

#The return values is the last value from the returning array
$result = (Calculate)[-1]
最佳答案
已经提供的几个答案并没有完全回答你的问题,因为他们没有说明你可能会打电话的其他cmdlet – 正如你指出的那样 – 可能会“污染”你的输出. @Laezylion的答案基本上是正确的,但我相信要进一步阐述.

很明显,您明白,您当前的解决方法 – 强制每个函数返回一个数组,然后获取最后一个元素 – 不是一个非常强大的解决方案. (事实上​​,我认为可以称之为一个垃圾.:-)正确的方法 – 直接回答你的问题 – 是清楚的,虽然乍看起来它听起来像一个重言式:

Question: How do you ensure a function returns only one thing?
Answer: By ensuring that it returns only one thing.

让我澄清一下PowerShell中有两种功能/ cmdlet:(A)返回数据的那些函数,(B)不返回数据的那些函数,但可能会报告进度或诊断消息.正如您所看到的,当您尝试混合两者时,出现问题.这可能很容易发生在无意中.因此,作为函数作者,您有责任了解函数内的每个函数/ cmdlet调用:具体来说,它是否返回任何东西,是真正的返回值还是只是诊断输出?您期望从A类函数输出,但您需要注意任何B类函数.对于任何一个返回的东西,您必须将其分配给一个变量,将其输入到管道中,或者使其消失. (有几种方法可以使它消失:将其传输到Out-Null,将其转换为void,将其重定向到$null,或将其分配给$null.请参见Jason Archer的Stack Overflow post,评估每种风格的性能,建议你避开Out-Null.)

是的,这种方法需要更多的努力,但是您可以通过这样做获得更强大的解决方案.有关这个问题的更多讨论,这些A / B功能等参见最近在Simple-Talk.com上发布的A Plethora of PowerShell Pitfalls上的问题1.

转载注明原文:如何从PowerShell函数返回一个值,只返回一个值? - 代码日志