gpt4 book ai didi

powershell - 如何从 PowerShell 函数返回一个且仅一个值?

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

我是从 this Stack Overflow question 学到的, PowerShell 返回语义与 C# 的返回语义不同。引自上述问题:

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

如果你回声 $result你会意识到有些事情不对劲。你会期望这个:
11

但现实,你实际看到的,是不同的:
Calculate
11

因此,您实际上不是只返回预期的返回值,而是返回一个数组。

你可以去掉 echo 语句而不污染返回值,但是如果你从你的函数中调用另一个函数,它会回显某些东西,那么你又会遇到麻烦。

如何编写只返回一件事的 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) 返回数据的函数/cmdlet 和(B) 不返回数据但可能会报告进度或诊断消息的函数/cmdlet。正如您所见,当您尝试将两者混合时,就会出现问题。而这很容易在不经意间发生。因此,作为函数作者,您有责任了解函数中的每个函数/cmdlet 调用:具体来说,它是否返回任何内容,是真正的返回值还是仅仅是诊断输出?您期望来自 A 类函数的输出,但您需要警惕任何 B 类函数。对于任何确实返回某些内容的人,您必须将其分配给一个变量,将其输入管道,或者……让它消失。 (有几种方法可以让它消失:通过管道将它传递给 Out-Null,将它强制转换为 void,将它重定向到 $null,或者将它分配给 $null。参见 Jason Archer 的 Stack Overflow post,它评估了每一个的性能口味,建议您避免使用 Out-Null。)

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

关于powershell - 如何从 PowerShell 函数返回一个且仅一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29556437/

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