Powershell从函数内部调用函数

时间:2011-12-09 18:32:45

标签: powershell powershell-v2.0

希望有人可以在这里帮助我,我只是试图从函数中调用函数。

我创建了一个简单的菜单,询问用户输入,然后根据所选的菜单选项运行另一个具有select的函数,然后根据所选的原始菜单代码调用其他函数。

简而言之,我会将自定义对象从每个函数传递到下一个函数而不返回主脚本菜单循环。我用Google搜索,似乎无法找到明确的答案和/或代码示例来解释如何执行此操作。

在下面的Jaitsu评论之后,我删除了很多代码并粘贴了脚本,以便您可以直接看到我的问题。

Jaitus提到使用回声,它实际上只是写输出的别名。我想在其他函数中使用输出属性而不返回主脚本循环。这甚至可以做或者我是否需要离开函数来创建一个变量,然后用于传递给下一个函数脚本块?

示例函数A返回一个对象但脚本在调用next之前从不离开函数,该函数从第一个脚本块返回。

附加的代码和评论进一步说明了我的困境,甚至不确定这是否可行,如果没有,那么关于如何进行菜单循环的任何其他建议将非常感激。

*修复代码,完成后将回发分享 *       感谢大家的投入......

2 个答案:

答案 0 :(得分:2)

如果要从函数输出多个变量(如果这是你想要的),你可以使用几种方法:

<强>作用域

您可以直接从函数中分配外部作用域中的变量:

$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文章或my post中找到有关范围的更多信息。

<强>管道

如果您返回多个对象,例如:

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

它们将作为数组返回,您可以通过普通方式管道:

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

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

请注意潜在的problems

复杂结果

你也可以像SpellingD一样构造一些复杂的对象并返回它。但是如果不需要与该对象链接的方法,我宁愿使用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

答案 1 :(得分:0)

你的问题对我来说有点难以解释,但这听起来像是你的主要问题

 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”

  3. 希望这有帮助。