考虑以下PowerShell脚本:
function Alpha {
# write-output 'Uncomment this line and see what happens.';
return 65;
}
function Bravo {
$x = Alpha;
$y = $x -eq 65;
return $y;
}
$z = Bravo;
echo $z;
在我的计算机(运行Windows XP SP3,.NET 4.0和PowerShell 2.0 RTM)上,运行脚本时,脚本的输出符合预期(True
)。但是,当“行”被取消注释(并且脚本再次运行)时,我只会看到Uncomment this line...
而不是65
前面的相同输出。有人可以解释一下发生了什么吗?感谢。
答案 0 :(得分:3)
Write-Output
只是将一个对象写入管道。如果您需要在屏幕上显示消息,请使用Write-Host
。
所以,要分解这里发生的事情,这是一种初步的。如果取消注释该行,则字符串'Uncomment this line and see what happens.'
和数字65
都是函数的输出,因此在调用Bravo
时,变量$y
不再仅包含一个值而是数组'Uncomment this line and see what happens.',65
。
现在,如果左操作数是数组而不是标量值,则比较运算符的工作方式不同。如果左操作数是一个数组,则它们只返回条件为$true
的数组中的所有元素。在这种情况下,由于您与65
进行比较,因此会返回所有等于65
的项目。所以结果不再是布尔值,而是一个对象数组(或者在这种情况下,只是一个对象) - 65
。
答案 1 :(得分:1)
从函数返回值时必须非常小心。 如果在函数的“return”语句之前使用“echo”(写入输出),则会损坏返回值,例如: ......回声“123”; return $ false ---这将解析为$ true。
# both function should return $false but the first one is evaluated to $true
function test_NG {Write-Output "this text WILL be included with the return value" ; return $false}
function test_OK {Write-Host "this text will NOT be included with the return value but visible on the screen" ; return $false}
if (test_NG) {"OK"} else {"NG"} # this should resolve to NG but is OK because write-output added the text to the return value
if (test_OK) {"OK"} else {"NG"} # correct result (NG) but the text is always displayed, even during this evaluation
答案 2 :(得分:0)
@JohannesRössel:谢谢你的解释。你知道,我是一个C#程序员(这解释了分号),我问这个问题,因为echo
调试语句(一种在其他语言中通常是惰性的语句)完全以奇怪的方式破坏了我的脚本。在追溯所谓的“奇怪行为”近一个小时之后,我想出了上面的脚本,将“奇怪的行为”缩小到两个函数。
感谢您的解释,现在我知道了两个重要的PowerShell问题:
echo
(Write-Output
)语句更改(添加)函数的返回值,return
语句添加(而不是设置)函数的返回值,可能形成一个数组。确实,可以通过运行以下PowerShell命令来验证这两个问题:
function Charlie { echo 2; echo 3; echo 5; return 7 }
$a = Charlie
# Nothing is printed.
$a
# Displays the contents of array $a, that is:
# 2
# 3
# 5
# 7
现在我可能想用Write-Warning
语句编写所有PowerShell调试语句。毕竟,它们的输出都是黄色的,因此可以更容易地读取和区分它们。