Вызов функции Powershell из функции - PullRequest
0 голосов
/ 09 декабря 2011

Надеюсь, кто-то может помочь мне здесь, я просто пытаюсь вызвать функцию изнутри функции.

Я создал простое меню, которое запрашивает ввод данных пользователем, и на основе выбранного параметра меню затем запускает другую функцию с выбором, которая затем вызывает другие функции в зависимости от выбранного исходного кода меню.

Короче говоря, я бы передавал пользовательские объекты из каждой функции в следующую, не возвращаясь в основной цикл меню скрипта. Я гуглил и не могу найти четкого ответа и / или пример кода, объясняющего, как это сделать.

После комментария Jaitsu, приведенного ниже, я удалил значительную часть своего кода и вставил скрипт, чтобы вы могли ясно увидеть мою проблему из первых рук.

Упомянутый Джайтус использует эхо, которое на самом деле является просто псевдонимом для записи-вывода. Я хотел бы использовать выходные свойства в других функциях, не возвращаясь в основной цикл сценария. Это вообще возможно сделать или мне нужно оставить функцию, чтобы создать переменную, которая затем используется для передачи в следующий блок скрипта функции?

Пример Функция A возвращает объект, но скрипт никогда не покидает функцию перед вызовом следующего, который ищет возврат из первого блока скрипта.

Код и комментарии, прилагаемые для дальнейшей иллюстрации моей дилеммы, даже не уверены, что это возможно сделать, а если нет, то любые дополнительные предложения о том, как сделать мой цикл меню, будут с благодарностью.

* фиксирующий код и отправит обратно, чтобы поделиться, когда будет завершено * Спасибо всем за ваш вклад ...

Ответы [ 2 ]

2 голосов
/ 04 марта 2013

Если вы хотите вывести несколько переменных из функции (если это то, что вам нужно), вы можете использовать несколько подходов:

Прицелы

Вы можете назначать переменные во внешней области непосредственно из функции:

$modifiedArg1 = $null
$modifiedArg2 = $null

Function Modify-OuterScope {
    Param ($Arg)
    $Script:modifiedArg1 = "Modified '$arg' first outer variable"
    $Script:modifiedArg2 = "Modified '$arg' second outer variable"        
}

Modify-OuterScope -Arg 'test'
Write-Host $modifiedArg1  # Modified 'test' first outer variable
Write-Host $modifiedArg2  # Modified 'test' second outer variable

Подробнее об областях можно узнать из статьи about_Scopes или моего сообщения .

Pipeline

Если вы возвращаете более одного объекта, например:

Function Foo {
    "string one"
    "string two"
}

они будут возвращены в виде массива, и вы можете передать его обычным способом:

Function Foo {
    "string one"
    "string two"
}

Foo | ForEach-Object { Write-Host "Returned item: '$_'" }

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

Комплексный результат

Также вы можете создать какой-нибудь сложный объект, как SpellingD write, и вернуть его. Но я бы предпочел Hashtable вместо PSObject, если нет необходимости в методах, связанных с этим объектом:

# create complex result
Function Create-NewAdmin {
    @{ 
        Name = "Root";
        Password = "Admin123"
    }
}

# Use complex result    
Function Write-User {
    Param($user)

    Write-Host $user.Name
    Write-Host $user.Password    
}

$admin = Create-NewAdmin

Write-User $admin
0 голосов
/ 10 декабря 2011

Ваш вопрос немного сложен для меня, но это звучит как ваша основная проблема

 If I create $emailname = $username.emailname doesn't seem to return anything from the previous function which I need to pass to the next function main_input

В Powershell переменные, созданные в функциях, остаются в этих функциях, после того как переменные идут вместе с ними. Поэтому, если вы создаете объект, который хотите передать, вам нужно, чтобы функция выводила объект и использовала вызов этой функции в качестве присваивания переменной. Похоже, вы делаете объект как переменную $ user в вашем скрипте. Поэтому, если вы хотите передать этот объект, вы должны сделать что-то похожее на следующее

function example{
    <string initializations>
    $user = new-object PSObject
    <assign properties to $user>
    echo $user
}

$myObject = example
SomeOtherFunction $myObject

Это устанавливает $ myObject для объекта, который вы создали как $ user (потому что отображение $ user в конце этой функции служит, так сказать, возвращаемым значением), так что вы можете затем передать $ myObject другим функциям и вызов $ myObject.property будет равен значению, которое было установлено при создании объекта.

Примечание:

# $user = name_split 
  1. Это просто сотрет всю работу, которую вы делали ранее при создании $ user в качестве нового объекта

  2. $ username, который вы определили как строку, поэтому у него не будет настраиваемого свойства "emailname", поскольку оно было создано в $ user. Таким образом, в этой функции $ user.emailname будет возвращать то, что вы добавили к объекту $ user, в качестве свойства «emailname»

Надеюсь, это поможет.

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