为什么Powershell会收集未捕获的值并将其作为数组返回

时间:2018-07-10 12:11:41

标签: powershell return

以下代码,尽管我认为应该返回一个值,但返回一个数组。

function Do-Something {
    123
    return 456
}

(Do-Something).GetType() # will say Object[]

我了解到,如果要避免这种情况,我必须像这样将不需要的值通过管道传递给Out-Null

function Do-Something {
    123 | Out-Null
    return 456
}

但是,为什么以这种方式实现PowerShell,我找不到任何理由。我发现,如果您忘记某些东西具有未捕获的返回值,则可能导致令人讨厌和无声的错误。有人可以解释何时可以派上用场吗?还可以强制Powershell不收集数组中所有未捕获的变量吗?

2 个答案:

答案 0 :(得分:5)

PowerShell将脚本或函数中所有语句的输出发送到输出管道中,因为它是一个shell,而shell就是这样工作的。 return语句有些遗憾,因为函数不会返回对象,而是将对象写入管道。能够终止函数的执行是必要的,但我们可能应该将其称为其他名称。简单地发出对象的能力使简单的脚本变得更简单,因为不需要显式的输出语句或返回。有时会引起问题吗-是的,有时会发生问题。因此,对于V5中引入的类,我们采用了更传统的编程语言语义。如果类中的方法要返回某项,则它必须声明一个返回类型,并且必须使用return语句返回一个值,否则不执行任何操作将返回。

答案 1 :(得分:2)

任何写入输出流的内容都被视为管道的一部分-import UIKit class SideMenuVC: UITableViewController { @IBOutlet weak var nameLabel: UILabel! var nameTextLabel = String() override func viewDidLoad() { super.viewDidLoad() nameLabel.text = nameTextLabel print("Label1 \(nameTextLabel)") } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print(indexPath.row) NotificationCenter.default.post(name: NSNotification.Name("ToggleSideMenu"), object: nil) switch indexPath.row { case 1: NotificationCenter.default.post(name: NSNotification.Name("ShowLessons"), object: nil) case 2: NotificationCenter.default.post(name: NSNotification.Name("ShowChat"), object: nil) case 3: NotificationCenter.default.post(name: NSNotification.Name("ShowNetwork"), object: nil) case 4: NotificationCenter.default.post(name: NSNotification.Name("ShowLike"), object: nil) case 5: NotificationCenter.default.post(name: NSNotification.Name("ShowAvtor"), object: nil) case 6: NotificationCenter.default.post(name: NSNotification.Name("ShowExit"), object: nil) default: break } } } 在Powershell中有点用词不当。虽然它“返回”一个值,但先前写入输出流的其他任何内容也属于“返回值”的一部分。在Powershell中,使用return“写入管道并退出当前函数”。比起传统的return指令对函数或方法而言,更像是break对循环的作用。

如果要输出return但不作为管道的一部分,请考虑使用Write-VerboseWrite-WarningWrite-DebugWrite-Host(是123的适当用法,因为您不希望将输出视为管道的一部分。

为什么为什么这样工作,所以在大多数其他Shell语言中都这样工作,应该可以预期。例如,Write-HostSTDOUTcmd中的任何sh输出都可以存储在变量中,通过管道传递到另一个命令,或者以其他方式重定向。尽管Powershell是一种功能强大的脚本语言,但它仍然还是一种交互式Shell,并且具有这种行为。

尽管并非只有您一个人认为bash在大多数其他编程语言的基础上考虑其隐含含义会造成混淆。