如何运行嵌入函数
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-AddGuests
和 Disable-AddGuests
范围限定为 script
范围。我在您的 Switch
语句中添加了 Default
条件,以便在您没有收到提示时所期望的值时执行某些操作。
执行 Manage-Teams
后,您就可以访问本示例中的 Enable-AddGuests
和 Disable-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:
范围是指全局范围。
我正在为我们 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-AddGuests
和 Disable-AddGuests
范围限定为 script
范围。我在您的 Switch
语句中添加了 Default
条件,以便在您没有收到提示时所期望的值时执行某些操作。
执行 Manage-Teams
后,您就可以访问本示例中的 Enable-AddGuests
和 Disable-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:
范围是指全局范围。