如何运行嵌入函数

How to run embedded function

我正在为我们 MSP 的交换管理员团队设置一个小脚本,该脚本由 4 个主要功能组成,这些功能中还有更多功能。我在 运行 嵌入式功能方面遇到了一些麻烦。下面我给出了这些函数之一的示例 "Manage-Teams"

我添加了一个开关($option)以查看是否可以解决问题,最初我有 $option = Read-host -prompt "some text"

这确实解决了问题,但是我在通过功能切换时找不到它

function Manage-Teams() {
    Write-Host -ForegroundColor Yellow "What would you like to do? <Enable-AddGuests/Home>"
    $option = Write-Host 'Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuest'
    function Enable-AddGuests () {

            #Set specific Group back to $True or $False
            # GroupID is <Name.ExcterDirectoryObjectId>
        $GroupID = get-unifiedgroup -Identity (Read-Host -prompt "object ID or SMTP") | Select-Object -ExpandProperty ExternalDirectoryObjectId
        $SettingID = Get-AzureADObjectSetting -TargetType Groups -TargetObjectID $GroupID | select-object -expandproperty ID
        remove-azureadobjectsetting -id $settingid -targettype Groups -TargetObjectID $GroupID
        $template = Get-AzureADDirectorySettingTemplate | ? {$_.displayname -eq "group.unified.guest"}
        $settingsCopy = $template.CreateDirectorySetting()
        $settingsCopy["AllowToAddGuests"]= True
        New-AzureADObjectSetting -TargetType Groups -TargetObjectId $groupID -DirectorySetting $settingsCopy
    }

    function Disable-AddGuests {

        #Set specific Group back to $True or $False
        # GroupID is <Name.ExcterDirectoryObjectId>
    $GroupID = get-unifiedgroup -Identity (Read-Host -prompt "object ID or SMTP") | Select-Object -ExpandProperty ExternalDirectoryObjectId
    $SettingID = Get-AzureADObjectSetting -TargetType Groups -TargetObjectID $GroupID | select-object -expandproperty ID
    remove-azureadobjectsetting -id $settingid -targettype Groups -TargetObjectID $GroupID
    $template = Get-AzureADDirectorySettingTemplate | ? {$_.displayname -eq "group.unified.guest"}
    $settingsCopy = $template.CreateDirectorySetting()
    $settingsCopy["AllowToAddGuests"]= False
    New-AzureADObjectSetting -TargetType Groups -TargetObjectId $groupID -DirectorySetting $settingsCopy
}
    Switch ($option) 
    {
        Enable-AddGuests {Enable-AddGuests}
        Disable-AddGuests {Disable-AddGuests}
        Home {Home}
    }
}

我希望得到以下结果:

Manage-teams "what would you like to do" Enable-AddGuests Runs function to enable guest access

您的代码似乎有错别字。

您正在使用 Write-Host cmdlet 而不是 Read-Host cmdlet。

改变这个:

$option = Write-Host 'Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuest'

为此:

$option = Read-Host 'Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuest'

这是您的脚本的简化版本,用于演示目的。

Function Manage-Teams {

    $option = Read-Host "Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuests"


    Function script:Enable-AddGuests {
        "Executing Enable-AddGuests"
    }
    Function script:Disable-AddGuests {
        "Executing Disable-AddGuests"
    }

    Switch ($option) {
        'Enable-AddGuests' {Enable-AddGuests}
        'Disable-AddGuests' {Disable-AddGuests}
        Default {"Entered an incorrect option"}
    }
}

输出:

Manage-Teams
Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuests: Enable-AddGuests
Executing Enable-AddGuests
Manage-Teams
Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuests: Disable-AddGuests
Executing Disable-AddGuests
Manage-Teams
Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuests: HelpMe
Entered an incorrect option

Get-Help Enable-AddGuests

NAME
    Enable-AddGuests

SYNTAX
    Enable-AddGuests


ALIASES
    None


REMARKS
    None



Get-Help Disable-AddGuests

NAME
    Disable-AddGuests

SYNTAX
    Disable-AddGuests


ALIASES
    None


REMARKS
    None

解释:

我将 $option 更改为使用 Read-Host 提示执行者一条消息,然后存储输入的响应。我将 Enable-AddGuestsDisable-AddGuests 范围限定为 script 范围。我在您的 Switch 语句中添加了 Default 条件,以便在您没有收到提示时所期望的值时执行某些操作。

执行 Manage-Teams 后,您就可以访问本示例中的 Enable-AddGuestsDisable-AddGuests 函数,因为它们的范围限定在脚本范围内。默认情况下,这些函数仅在其封闭范围内是本地的,即在 Manage-Teams 内部,并且对外部不可见。您也可以使用 Tab 键完成它们。如果你想在没有 运行 Manage-Teams 的情况下访问这些函数,你需要在 Manage-Teams.

之外定义和加载它们

让我退一步补充

如果您希望嵌套函数在外部定义它们的函数中可见,只需在外部直接定义它们范围.

默认情况下,与变量一样,嵌套函数在它们定义的范围内是局部的并且后代[中也可见=51=] scopes,这样 定义为 siblings 的函数在同一作用域 中可以 相互调用.

在同一范围内定义所有函数时,您避免了使用 script: 在(固定的)不同 范围[=45= 中定义函数的尴尬][1]:

  • 虽然 PowerShell 允许您修改其他作用域,但从稳健性和可维护性的角度来看,这通常不是一个好主意。

  • 通过从另一个函数内部定义 script-level 函数,它们不会对脚本范围可见 直到第一次调用 定义函数。

因此,您的代码结构如下:

# All functions are defined in the same scope, as siblings.

Function Enable-AddGuests {
  # ...
}

Function Disable-AddGuests {
  # ...
}

Function Manage-Teams {

    $option = Read-Host "Would you like to allow or disable external access? Enable-AddGuests/Disable-AddGuests"

    switch ($option) {
      'Enable-AddGuests'  { Enable-AddGuests; break }
      'Disable-AddGuests' { Disable-AddGuests; break }
    }
}

[1] 请注意,对于粘贴的代码或 "dot-sourced"(来自脚本,使用运算符 .)在 命令行 , script:范围是指全局范围。