Странное поведение Windows PowerShell 2.0 - PullRequest
1 голос
/ 20 июня 2010

Рассмотрим следующий скрипт 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 с пакетом обновления 3 (SP3), .NET 4.0 и PowerShell 2.0 RTM) при запуске сценария выходные данные сценария ожидаются (True). Однако, когда «строка» не закомментирована (и сценарий запускается снова), вместо того, чтобы увидеть тот же вывод, добавленный Uncomment this line..., я вижу только 65. Может кто-нибудь объяснить, что происходит? Спасибо.

Ответы [ 3 ]

3 голосов
/ 20 июня 2010

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 голос
/ 27 июля 2011

Нужно быть очень осторожным при возврате значений из функции. Если «echo» (запись-вывод) используется перед оператором «return», это повредит возврат, например. ... эхо "123"; вернуть $ 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
0 голосов
/ 20 июня 2010

@ Johannes Rössel: Спасибо за ваше объяснение.Вы знаете, я программист на C # (это объясняет точки с запятой), и я задаю этот вопрос, потому что оператор отладки echo (оператор, который обычно инертен на других языках), совершенно странным образом сломал мой скрипт.Прослеживая предполагаемое «странное поведение» в течение почти часа, я придумал приведенный выше сценарий, сузив «странное поведение» до двух функций.

Благодаря вашему объяснению теперь я знаю две важныеPowerShell получил:

  1. , что оператор echo (Write-Output) изменяет (добавляет к) возвращаемое значение функции, и
  2. , к которому добавляется оператор 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

Теперь я, вероятно, хочувместо этого написать все мои операторы отладки PowerShell с помощью оператора Write-Warning.В конце концов, их выводы окрашены в желтый цвет, поэтому их легче читать и различать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...