Вернуть объект из PowerShell с помощью параметра (параметр «По ссылке»)? - PullRequest
7 голосов
/ 03 марта 2011

У меня есть один скрипт PowerShell (2.0), вызывающий другой. Я хочу получить обратно не только основной вывод, но и дополнительный объект, который я могу использовать отдельно, например, для отображения итоговой строки в сообщении.

Давайте в качестве вызываемого скрипта используем Test2.ps1:

param([String]$SummaryLine)
$Issues = "Potentially long list of issues"
$SummaryLine = "37 issues found"
$Issues

И Test1.ps1 как скрипт, который его вызывает:

$MainOutput = & ".\Test2.ps1" -SummaryLine $SummaryOutput
$MainOutput
$SummaryOutput

Выход просто:

Potentially long list of issues

Хотя параметр $ SummaryLine заполняется Test2, $ SummaryOutput остается неопределенным в Test1.

Определение $ SummaryOutput перед вызовом Test2 не помогает; он просто сохраняет значение, назначенное до вызова Test2.

Я пытался настроить $ SummaryOutput и $ SummaryLine в качестве переменных [ref] (как, очевидно, можно сделать с функциями), но свойство $ SummaryOutput.Value после вызова Test2 равно $ null.

Возможно ли в PowerShell возвращать значение параметра? Если нет, каковы обходные пути? Непосредственное присвоение родительской переменной в Test2?

Ответы [ 2 ]

9 голосов
/ 03 марта 2011

Ref должен работать, вы не говорите, что случилось, когда вы попробовали это.Вот пример:

Test.ps1:

Param ([ref]$OptionalOutput)

"Standard output"
$OptionalOutput.Value = "Optional Output"

Запустите его:

$x = ""
.\Test.ps1 ([ref]$x)
$x

Вот альтернатива, которая вам может понравиться лучше.

Test.ps1:

Param ($OptionalOutput)

"Standard output"
if ($OptionalOutput) {
    $OptionalOutput | Add-Member NoteProperty Summary "Optional Output"
}

Запустите его:

$x = New-Object PSObject
.\Test.ps1 $x
$x.Summary
1 голос
/ 03 марта 2011

Это ближе к тому, что вы хотите сделать?

Test2.ps1

 $Issues = "Potentially long list of issues"
 $SummaryLine = "37 issues found"
 $Issues
 $SummaryLine

Test1.ps1

 $MainOutput,$SummaryOutput = & ".\Test2.ps1" 
 $MainOutput 
 $SummaryOutput

Это:

 param([String]$SummaryLine)
 $Issues = "Potentially long list of issues"
 $SummaryLine = "37 issues found"
 $Issues

Иррационально.Вы передаете параметр для $ SummaryLine, а затем немедленно заменяете его на «37 проблем найдено».Эта переменная существует только в области действия вызываемого сценария. Как только этот сценарий завершается, он исчезает.Если вы хотите использовать его позже, вам нужно вывести его и сохранить в переменной в вызывающем скрипте.

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