Какие строки возвращают вывод в скрипте Powershell? - PullRequest
2 голосов
/ 10 августа 2011

В общем, существует ли удобный способ выяснить, какие строки скрипта / функции PowerShell возвращают значения («не захвачены»)? Я надеялся, что есть способ запросить текущее состояние возвращаемого значения во время отладки. Я могу проверить его после каждой строки, чтобы увидеть, какие строки добавляют к нему.

У меня есть несколько скриптов в работе, и некоторые строки превращают мое возвращаемое значение в Object []. Я обычно направляю такие линии в Out-Null, чтобы исправить ситуацию. Я хочу вернуть только один объект (который я выбираю в конце функции).

Некоторые строки - это вызовы командлетов, некоторые - вызовы других функций, а некоторые - вызовы функций для объектов .NET.

Ответы [ 2 ]

6 голосов
/ 10 августа 2011

Полагаю, вы можете использовать Set-PsDebug -trace 1, чтобы увидеть, какая строка их возвращает.

Пример:

Рассмотрим скрипт ниже:

function f{
1..10
}

function g{
f
return 11
}

g

После выполнения Set-PsDebug -trace 1 трассировка будет выглядеть примерно так:

DEBUG:    1+  <<<< .\test.ps1
DEBUG:    1+ function f <<<< {
DEBUG:    5+ function g <<<< {
DEBUG:   10+  <<<< g
DEBUG:    6+  <<<< f
DEBUG:    2+ 1.. <<<< 10
1
2
3
4
5
6
7
8
9
10
DEBUG:    7+ return <<<<  11
11

Очевидно, вы можете видеть, откуда поступает вывод. Но если вывод получен, вы не получите это.

Кроме того, если вы не заботитесь о других объектах, которые возвращаются, и хотите получить только последний объект, который вы вернули с помощью оператора return, вы всегда можете сделать что-то вроде (func)[-1] или func | select -last 1 (как указано в комментарии), чтобы получить последний.

3 голосов
/ 10 августа 2011

Чтобы завершить возможный ответ, я хотел бы добавить 2 примечания:

Во-первых, если вы используете func | select -last 1, вы должны обернуть возвращаемый объект в массив, если вы возвращаете сам массив.Зачем?Посмотрите на неудачный пример:

function MyOutputs {
    $list = new-Object Collections.ArrayList
    $list.Add('first')
    $list.Add('second')
    $list
}
myoutputs | Select -last 1 #doesn't work

Во-вторых, если вы не знаете точно, какие команды возвращают вывод, вы можете Out-Null все они так:

function MyOutputs {
    . { 
        $list = new-Object Collections.ArrayList
        $list.Add('first')  # returns index
        $list.Add('second') # returns index
    } | Out-Null
    write-Host Returning...
    $list
}
$a = MyOutputs
Write-Host Result is
$a

Просто попробуйтепоместить код ArrayList вне блока скриптов, и вы увидите, что он делает.Запуск его внутри блока сценария с обозначением . означает, что блок сценария выполняется в текущей области видимости.Out-Null просто ест вывод из Add методов.

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