【问题标题】:Choose from multiple return values从多个返回值中选择
【发布时间】:2015-05-26 20:25:58
【问题描述】:

当我有一个函数,它使用多个Write-Output 命令并返回单个数字时,如何在函数调用者代码中获取数字值? 据我所知,行

[int] $var = Get-MyNumber(...)

告诉我错误

无法将“System.Object[]”类型的“System.Object[]”值转换为“System.Int32”类型。

可能是因为 PowerShell 将一组对象(包含 Write-Output 消息)返回给调用者代码,其中对 [int] 类型变量的分配失败。明白了。

现在,我如何告诉 PowerShell 我只对函数返回的值中的一个值感兴趣,该值的类型为 [int]

顺便说一句,我不想​​通过索引返回数组来选择输出,因为我可以通过添加另一个 Write-Output 行来弄乱返回数组中的索引。 (由于代码维护,这迟早会发生)。

代码

function f1() {
    Write-Output "Lala"
    return 5
}

[int] $x = f1
Write-Output $x

导致同样的错误。

【问题讨论】:

  • 你能把Get-MyNumber的代码贴出来吗?
  • 如果不想返回多个值,为什么还要多次使用Write-Output?如果您尝试向用户显示信息,请使用Write-Host(或者更好的是,使用Write-Verbose)。
  • 使用Write-Output 没有问题。甚至比 Write-Host 更喜欢它也不是问题(goo.gl/gHEle9 等等......)。这就是 PowerShell 的工作原理,我似乎无法理解它。
  • 您在 PowerShell 中必须小心,不要“意外”将某些内容写入输出流,但明确使用 Write-Output 并非偶然。正如@briantist 所说,除了 write-ouptut(如 write-verbose 和 write-debug)之外,还有其他 write-host 选项
  • @MatthewLowe 实际上,一旦您决定返回一个值,即您使用Write-Output。否则你不会真正使用它。所以问题是你还用它做什么?我只能考虑编写输出供用户查看,例如状态消息,而 Write-Output 是该工作的错误工具。

标签: powershell scripting


【解决方案1】:

我从您的编辑中看到您正在使用Write-Output 来显示状态消息。

您应该为此使用Write-Host,或者如果您使用advanced function,我建议您使用Write-Verbose并在您想查看消息时使用-Verbose调用函数(请参阅about_CommonParameters) .

更新代码:

function f1() {
    Write-Host "Lala"
    return 5
}

[int] $x = f1
Write-Host $x

高级函数示例

function f1 {
[CmdletBinding()]
param()

    Write-Verbose "Lala"
    return 5
}

$x = f1
# The "Lala" message will not be seen.

$x = f1 -Verbose
# The "Lala" message will be seen.

为什么Write-Output 似乎在函数之外工作:

Write-Output 将输入对象传递给调用者。对于直接在主机中而不是在函数或 cmdlet 中执行的代码,调用者就是主机,主机决定如何处理它。对于 powershell.exe(或 ISE),它会显示它。

另一方面,Write-Host 总是写入主机;它不会将任何内容传回给调用者。

还要注意Write-Output 基本上是可选的。以下几行是等价的:

Write-Output $x
$x

【讨论】:

  • 我通常会在您的最后说明中添加以下内容也是相同的。 return $x$x ; return
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-04-08
  • 2013-12-02
相关资源
最近更新 更多