Powershell: получить результат возврата из скрипта Powershell, вызываемого из другого скрипта PS - PullRequest
6 голосов
/ 09 августа 2011

Справочная информация: У меня есть сценарий powershell: script1, который принимает sourceDirectory и два пункта назначения (назовите их dest1Directory и dest2Directory).

SourceDirectory имеет следующую структуру:

\ Source \ dest1 \ STUFF1

и

\ Source \ dest2 \ STUFF2

script1 вызывает другой сценарий: script2, foreach STUFF (например, script2 может запускаться 10 раз), предоставляя script2 необходимый целевой параметр, который создает резервные копии всего содержимого «STUFF» заменяет dest1Directory и dest2Directory, а затем копирует весь STUFF в соответствующий пункт назначения.

Script1

foreach ($folder in $STUFF1)
{           
& $script2 -stuffParameter $folder -destDrive $dest1Directory -backUpDrive $BackUpDirectory
}

У меня проблема:

Я звоню script1 с веб-сайта visual studio и хотел бы script2 вывести все пути к каталогам резервных копий, которые он создает, поэтому у меня есть ссылки на них для дальнейшего использования. Я пробовал это внутри script2:

$returnRollBackObj = New-Object Object
Add-Member -memberType NoteProperty -name "RollBackLocation" -value $folderobj -inputObject $returnRollBackObj
return $returnRollBackObj

Но, похоже, объекты не возвращаются, поскольку они являются вызовами нижнего уровня. Я не знаю, как вернуть неопределенное количество этих объектов из script1, поэтому я в растерянности. Кто-нибудь может мне помочь?

Ответы [ 2 ]

11 голосов
/ 09 августа 2011

Любой незаписанный вывод возвращается в Powershell.

Таким образом, что-то вроде

return $returnRollBackObj

эквивалентно

$returnRollBackObj
return

Итак, так как script2 возвращает эти объекты,пока эти объекты не захвачены в script1, они также будут возвращены script1.Так что вам не нужно ничего делать с «возвратом неопределенного числа объектов»

Попробуйте сначала запустить сценарии из консоли, чтобы проверить, получаете ли вы ожидаемое поведение.

2 голосов
/ 09 августа 2011

Как настроены IIS?

Просто подумайте, если у вас есть олицетворение, то оно может не иметь доступа ко второму сценарию из-за проблемы двойного прыжка.

Что-то еще, что может помочь, - функциональность стенограммы Добавьте старт-транскрипт вверху скрипта / кода yu, и вы получите дамп всего, команд и вывода (в том числе ошибки и предупреждения).

Редактировать:

Только что понял, что вы не присваиваете возвращаемые значения из script2 для чего-либо в script1.

Вам может понадобиться что-то вроде этого:

$ ret = & $ script2 ...

Сделай что-нибудь с $ ret ...

ИЛИ положить его в массив $ ret = @ ()

Для цикла ...

$ temp = & $ script2 ... $ ret = $ ret + $ temp

Затем верните $ ret после цикла for.

Мэтт

...