我最近在学习PowerShell,发现了一个我无法理解的行为.让我在下面的代码中解释:
function func1()
{
Write-Output "output from func1()"
func2
return $true
}
function func2()
{
Write-Output "output from func2()"
func3
}
function func3()
{
Write-Output "output from func3()"
}
Write-Output "*** 1. run alone ****"
func1
Write-Output "*** 2. run inside if ****"
if (func1) {
#do nothing
}
Run Code Online (Sandbox Code Playgroud)
直接调用func1时很奇怪,它可以按预期输出消息,但是如果放在"if"语句中,它就不会.见输出如下:
*** 1. run alone ****
output from func1()
output from func2()
output from func3()
True
*** 2. run inside if ****
Run Code Online (Sandbox Code Playgroud)
你可以看到它是空的.为什么会这样,我如何像第一个例子那样启用输出?谢谢!
您可以通过替换Write-Output为来获得所需的结果Write-Host。这是适合只有当你的主要关注是产生在控制台输出Write-Host并没有去到stdout流。
您可以阅读有关此 SO 线程中 2 个 cmdlet 之间差异的更多信息:我应该使用哪个:“Write-Host”、“Write-Output”或“[console]::WriteLine”?
PowerShell函数与传统语言的函数不同:它们可以输出多个内容。使用时Write-Output,您正在沿管道发送消息,因此func1()将同时返回String和Boolean。如果您尝试这样做:
$return_values = func1;
$return_values | Get-Member
Run Code Online (Sandbox Code Playgroud)
您将看到同时包含System.String和System.Boolean对象$return_values。实际上,“ return”语句更像是传统语言中的“ exit”或“ break”:它标记了一个出口点,但是该函数实际上将以已经输出的任何内容返回(+可选的return参数)。
快速解决此问题的方法是将更Write-Output改为Write-Host,尽管他们做的事情略有不同。
| 归档时间: |
|
| 查看次数: |
3820 次 |
| 最近记录: |