奇怪的Windows PowerShell 2.0行为

时间:2010-06-20 08:00:32

标签: powershell

考虑以下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前面的相同输出。有人可以解释一下发生了什么吗?感谢。

3 个答案:

答案 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问题:

  1. echoWrite-Output)语句更改(添加)函数的返回值,
  2. return语句添加(而不是设置)函数的返回值,可能形成一个数组。
  3. 确实,可以通过运行以下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调试语句。毕竟,它们的输出都是黄色的,因此可以更容易地读取和区分它们。