天道酬勤,学无止境

在自定义模块中使用时,Import-Pssession 不导入 cmdlet(Import-Pssession is not importing cmdlets when used in a custom module)

问题

我有一个 PowerShell 脚本/函数,当我在我的 PowerShell 配置文件中使用它或在 PowerShell 窗口中手动复制/粘贴该函数时效果很好。

我正在尝试使我团队的其他成员可以作为一个模块访问该功能。 我希望将模块存储在一个中心位置,以便我们都可以将它添加到我们的 PSModulePath。

这是基本功能的副本:

Function Connect-O365{
    $o365cred = Get-Credential username@domain.onmicrosoft.com
    $session365 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $o365cred -Authentication Basic -AllowRedirection
    Import-PSSession $session365 -AllowClobber
}

如果我将此函数保存在我的 PowerShell 配置文件中,它可以正常工作。 我可以在其中包含此函数的 *.ps1 脚本,它也可以工作。

问题是当我将函数另存为 *.psm1 PowerShell 脚本模块时。 该函数运行良好,但 Import-PSSession 中导出的命令均不可用。 我认为这可能与模块范围有关。

我正在寻找有关如何解决此问题的建议。

编辑

当我创建以下模块并运行 Connect-O365 时,导入的 cmdlet 将不可用。

$scriptblock = {
    Function Connect-O365 {
        $o365cred = Get-Credential username@domain.onmicrosoft.com
        $session365 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://ps.outlook.com/powershell/" -Credential $o365cred -Authentication Basic -AllowRedirection
        Import-PSSession $session365 -AllowClobber
    }
}

New-Module -Name "Office 365" -ScriptBlock $scriptblock

当我导入没有 Connect-O365 功能的下一个模块时,导入的 cmdlet 可用。

$scriptblock = {
    $o365cred = Get-Credential username@domain.onmicrosoft.com
    $session365 = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri "https://ps.outlook.com/powershell/" -Credential $o365cred -Authentication Basic -AllowRedirection
    Import-PSSession $session365 -AllowClobber
}

New-Module -Name "Office 365" -ScriptBlock $scriptblock

这似乎是某种范围的问题,只是不知道如何解决它。

回答1

在 TechNet 的帮助下,我能够修改脚本模块,使其按我预期的方式工作。

function Connect-O365 {
    $o365cred = Get-Credential username@domain.onmicrosoft.com
    $session365 = New-PSSession `
                    -ConfigurationName Microsoft.Exchange `
                    -ConnectionUri "https://ps.outlook.com/powershell/" `
                    -Credential $o365cred `
                    -Authentication Basic `
                    -AllowRedirection 
    Import-Module (Import-PSSession $session365 -AllowClobber) -Global
}

技术网邮报

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Powershell 远程处理:在远程 pssession 中使用导入的模块 cmdlet(Powershell Remoting: using imported module cmdlets in a remote pssession)
    问题 有没有办法在远程会话中使用在本地会话中导入的模块? 我查看了import-pssession,但不知道如何获取本地会话。 这是我想要做的示例。 import-module .\MyModule\MyModule.ps1 $session = new-pssession -computerName RemoteComputer invoke-command -session $session -scriptblock { Use-CmdletFromMyModule } 另外,我不想在远程会话中导入模块,因为 ps1 文件不在该服务器上。 回答1 我最终破解了这个工作。 我所做的是创建一个本地会话,将模块导入该会话并使用 import-pssession 将模块从创建的本地会话导入远程会话。 这很慢。 如果有人有更好的方法来做到这一点,或者如果有人知道如何获取基础会话的实例,我很乐意听取您的意见! 远程处理.psm1 function Export-ModuleToSession { Param( [ValidateNotNull()] $session, [ValidateNotNull()] $modules ) $computername = $env:computername $modulesToImport = get-module -name $modules
  • 从另一个模块的函数创建时,来自隐式远程处理模块的命令不可用(Commands from implicit remoting module not available when created from another module's function)
    问题 我是高级 PowerShell 技术的初学者。 我正在尝试编写自己的 PS 模块。 希望我能正确表达我的问题。 背景:我创建了一个包含所有常用函数的模块,称为MyTools 。 PSM1 文件只是点源同一模块文件夹中的其他 PS1 文件。 在模块的末尾,我使用Export-ModuleMember -Function * -Alias * -Cmdlet *模块成员。 (我还创建了一个清单,但我不确定这对我的问题是否重要。) 这些函数之一(称为Connect-O365 )在点源 PS1 文件之一中定义。 该功能自动连接到 Office 365 远程 powershell。 该函数的关键部分只是做: $O365PS = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $O365URL -Credential $Credential -Authentication Basic -AllowRedirection -Name "O365-$($Credential.UserName)" #-WarningAction SilentlyContinue Import-PSSession -Session $O365PS -Prefix $CommandPrefix -WarningAction
  • 在 C# 中连接到 Microsoft Exchange PowerShell(Connect to Microsoft Exchange PowerShell within C#)
    问题 我正在尝试从 C# .NET WinForms 应用程序连接到远程 powershell。 我的目标是创建我自己的 Microsoft PowerShell ISE 版本。 所以我需要一种在远程机器上从我的应用程序执行 PowerShell 脚本的方法。 我已经创建了几种方法并通过我的应用程序在本地机器上对其进行了测试。 如果我不使用WSManConnectionInfo并使用using (Runspace remoteRunspace = RunspaceFactory.CreateRunspace())我可以在本地执行脚本,就好像它是真正的 powershell(小脚本,变量的使用,使用ft , fl输出数据,做很多我通常使用 powershell 做的其他事情。当我添加WSManConnectionInfo并将其指向我的 Exchange Server 而不是使用本地连接时,问题就开始了。它似乎能够执行诸如“get-mailbox”之类的基本内容,但是一旦我尝试通过管道传输内容, 使用一些脚本功能,如 $variables 它打破说它不受支持。 同样,我必须禁用powershell.AddCommand("out-string"); 当不在本地使用时。 System.Management.Automation.dll 中发生类型为“System.Management
  • Exchange Powershell - 如何从脚本内部调用 Exchange 2010 模块?(Exchange Powershell - How to invoke Exchange 2010 module from inside script?)
    问题 我正在编写一个脚本,该脚本可以使用 AD 和 Exchange 执行许多操作,并且刚刚进入 GUI 的一部分,我需要在该部分开始使用 Exchange,但没有看到可以手动指定包含 Exchange 模块的位置。 我熟悉的正常过程是 import-module activedirectory 但 import-module exchange 不起作用。 我执行了 Get-Module -ListAvailable | 选择名称,并且看不到任何指示 Exchange 的内容。 但是,Exchange 命令行管理程序已加载到我正在使用的 Exchange 服务器上。 有谁知道如何在我的脚本中包含 Exchange 2010 模块,以便我可以在内部使用特定于 Exchange 的 cmdlet? 蒂亚... 回答1 你可以这样做: add-pssnapin Microsoft.Exchange.Management.PowerShell.E2010 并且大部分都可以工作(尽管 MS 支持会告诉您不支持这样做,因为它绕过了 RBAC)。 我已经看到一些 cmdlet(特别是启用/禁用 UMmailbox)的问题,仅在加载管理单元时无法正常工作。 在 Exchange 2010 中,它们基本上不支持在实际 EMS shell 的隐式远程处理环境之外使用 Powershell。 回答2
  • 如何在自定义脚本 cmdlet 中指定参数接受通配符(How do you specify that a parameter accepts wildcard characters in a custom script cmdlet)
    问题 当您执行Get-Help SomeCommand -Full ,在每个参数下,在描述之后,还有一些额外的参数属性。 这些属性之一是“接受通配符?”。 当我为自定义脚本 cmdlet 创建帮助信息时,如何指定参数接受通配符? 回答1 在脚本的param部分中,添加属性SupportsWildcards() 。 前任。: param ( [SupportsWildcards()][String]$variable ) 回答2 如果你想能够做到这一点,它将需要一些东西。 首先,你要么必须创建一个.dll文件,你是不是做,或者你必须创建一个模块。 我不会详细介绍创建模块的所有细节,互联网上已经有很多关于如何做到这一点的编写良好的指南,你可以去查找。 作为模块的一部分,您可以包含 .XML 文件,这些文件提供的帮助信息类似​​于可用于单个脚本的注释帮助。 XML 样式确实有一些优点,例如一致性和一些高级特性,但确实需要更多的努力。 为此,我强烈建议阅读“Windows PowerShell 模块的编写帮助”,因为它会解释 XML 文件的放置位置、如何构建它们以及所需的标头以及什么不是。 如果是我,我可能会复制现有的 XML 帮助文件并对其进行编辑以适应我对 cmdlet 的需求,找到并阅读关于创建模块的快速和肮脏的 HowTo 之一,然后放弃这个想法
  • 在 PowerShell 模块中忽略 Write-Verbose(Write-Verbose ignored in PowerShell module)
    问题 我希望在脚本和函数中使用Write-Verbose commandlet。 它在脚本 (.ps1) 文件中按预期工作,但在模块 (.psm1) 文件中不正常 - 在模块中忽略命令行开关。 运行以下脚本: PS> .\scaffold.ps1 -verbose 产生: VERBOSE: starting foo path: c:\bar.txt [missing entry here - 'verbose path: c:\bar.txt'] VERBOSE: ending foo 脚手架.ps1: [cmdletbinding()] param() import-module Common -force write-verbose "starting foo" foo "c:\bar.txt" write-verbose "ending foo" Common.psm1: function foo { [cmdletbinding()] Param( [string]$path ) write-host "path: $path" write-verbose "verbose path: $path" } 此时我还没有将清单 (.psd1) 与模块 (.psm1) 相关联。 我需要使用特定于模块的语法吗? ** 编辑 ** 我需要一种方法来确定是否在 .PS1 文件上设置了
  • 如何安全地读取 PowerShell .PSD1 文件(How to read PowerShell .PSD1 files safely)
    问题 PowerShell 模块清单文件格式 (.psd1) 本质上是具有某些预期键的哈希表文字。 这是 PowerShell 脚本的配置文件的理想选择。 我最终想要做的是读取一个 .psd1 文件,其中包含一组特定于脚本的键。 例如(MyScriptConfig.psd1): @{ FTPHost = "ftp.blah.com" FTPUserName = "blah" FTPPassword = "blah" } 对于这些信息,我没有理由不能使用 XML、INI、JSON 或其他任何格式,但我宁愿它使用与 PowerShell 的模块清单相同的基本数据格式。 显然,最简单的方法是读取文本并将其传递给Invoke-Expression ,后者将返回一个 Hashtable,但随后它会调用文件中的任何内容,这很容易出错且可能不安全。 我以为我记得使用 PowerShell cmdlet 的“安全”子集读取此数据的 cmdlet,但我想到了ConvertFrom-StringData和DATA部分,这两个部分都ConvertFrom-StringData我读取包含 Hashtable 文字的任意文件。 PowerShell 中是否有内置的东西可以让我这样做? 如果没有内置任何东西,那么我可能会使用ConvertFrom-StringData走 JSON 或 Key=Value
  • 如何在自定义 cmdlet 中正确使用 -verbose 和 -debug 参数(How to properly use the -verbose and -debug parameters in a custom cmdlet)
    问题 默认情况下,任何具有 [CmdletBinding()] 属性的命名函数都接受-debug和-verbose (以及其他一些)参数,并具有预定义的$debug和$verbose变量。 我试图弄清楚如何将它们传递给在函数内调用的其他 cmdlet。 假设我有一个这样的 cmdlet: function DoStuff() { [CmdletBinding()] PROCESS { new-item Test -type Directory } } 如果-debug或-verbose被传递到我的函数中,我想将该标志传递到new-item cmdlet 中。 这样做的正确模式是什么? 回答1 也许这听起来很奇怪,但没有任何简单的方法让 cmdlet 知道其详细或调试模式。 看一下相关问题: cmdlet 如何知道何时真正应该调用 WriteVerbose()? 一种不完美但实际上合理的选项是引入您自己的 cmdlet 参数(例如, $MyVerbose和$MyDebug )并在代码中明确使用它们: function DoStuff { [CmdletBinding()] param ( # Unfortunately, we cannot use Verbose name with CmdletBinding [switch]$MyVerbose ) process { if (
  • Exchange Online - Get-UserPhoto - 如何捕获非终止错误?(Exchange Online - Get-UserPhoto - how to catch non terminating error?)
    问题 我正在尝试使用 powershell 从我们的 Exchange Online 帐户导出所有没有照片的用户的列表。 我无法让它工作并尝试了各种方法。 当不存在配置文件时,Get-UserPhoto 返回此异常。 Microsoft.Exchange.Data.Storage.UserPhotoNotFoundException: There is no photo stored here. 首先,我尝试对命令使用Errorvariable但收到: A variable that cannot be referenced in restricted language mode or a Data section is being referenced. Variables that can be referenced include the following: $PSCulture, $PSUICulture, $true, $false, and $null. + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : VariableReferenceNotSupportedInDataSection + PSComputerName : outlook
  • 如何在 powershell 中列出所有已安装、可运行的 cmdlet?(How to list all installed, runnable cmdlets in powershell?)
    问题 我想在 powershell 中列出所有已安装的、可运行的 cmdlet 和函数,但Get-Command正在列出以某种方式“存在”但未加载且不可运行的 cmdlet。 例如, Get-Command列出了New-IseSnippet : PS W:\> get-command "*-*" -CommandType Function,Cmdlet | where name -like "New-IseSnippet" | select name,module,path Name Module path ---- ------ ---- New-IseSnippet ISE 所以看起来我们有一个New-IseSnippet命令 - 让我们检查它: PS W:\> get-command New-IseSnippet get-command : The term 'New-IseSnippet' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again. At
  • PowerShell 模块 - 导入模块时传递参数(PowerShell module - pass a parameter while importing module)
    问题 在下面的示例模块文件中,有没有办法在导入模块时传递 myvar 值。 例如, import-module -name .\test.psm1 -?? pass a parameter? e.g value of myvar #test.psm1 $script:myvar = "hi" function Show-MyVar {Write-Host $script:myvar} function Set-MyVar ($Value) {$script:myvar = $Value} #end test.psm1 (这个片段是从另一个问题复制的。) 回答1 这对我有用: 您可以使用import-module cmdlet 的–ArgumentList参数在加载模块时传递参数。 您应该在模块中使用param块来定义参数: param( [parameter(Position=0,Mandatory=$false)][boolean]$BeQuiet=$true, [parameter(Position=1,Mandatory=$false)][string]$URL ) 然后像这样调用import-module cmdlet: import-module .\myModule.psm1 -ArgumentList $True,'http://www.microsoft.com'
  • Powershell 模块初始化(Powershell module initialization)
    问题 加载模块时 PowerShell 是否调用任何初始化代码? 我正在寻找类似 Perl BEGIN 块或构造函数的东西。 NEW-MODULE 和 IMPORT-MODULE 都将返回一个 PSCustomObject。 我正在尝试将自定义对象封装在模块中以避免脚本中的冗长代码。 在开放代码中测试良好的一种方法是: $m = new-module -scriptblock { New-Object PSCustomObject | Add-Member NoteProperty -name person -value Frodo -passthru | Add-Member ScriptMethod Who { $this.person } -passthru | Add-Member ScriptMethod Mod { param($x) $this.person = $x } -passthru } -ascustomobject -returnresult 理想情况下,我想将此代码放入模块中并使用以下内容: $MyObj = Import-Module -Name ".\MyPackage" -AsCustomObject 并让 MyObj 成为与第一个片段提供的对象相同的对象句柄。 建议表示赞赏。 回答1 不清楚是要在加载模块时运行初始化代码(如 Perl 的
  • 判断connect-msolservice是否已经成功调用(Determine if connect-msolservice has already been successfully called)
    问题 我正在 PowerShell 中编写 Office 365 辅助工具,我认为这是一个我找不到答案的简单问题。 如何判断由Connect-MsolService创建的Connect-MsolService是否存在且处于活动状态? 必须有某种方式可以知道,因为其他 cmdlet 可以检查,我只是不知道那种方式是什么,而且我没有找到它。 回答1 Connect-MsolService返回一个对象,据我所知不会添加新变量。 也许您可以通过运行其中一个模块命令并根据命令的执行结果来确定: Get-MsolDomain -ErrorAction SilentlyContinue if($?) { "connected" } else { "disconnected" } 回答2 这是我的解决方案。 try { Get-MsolDomain -ErrorAction Stop > $null } catch { if ($cred -eq $null) {$cred = Get-Credential $O365Adminuser} Write-Output "Connecting to Office 365..." Connect-MsolService -Credential $cred } 回答3 我知道这是一个老问题,但这就是我这样做的方式: # Only run if not
  • 使用 System.Management.Automation 时,如何访问 .NET Core 中的 CimCmdlets?(How do I get access to CimCmdlets in .NET Core when using System.Management.Automation?)
    问题 目标 我想在 C# 代码中访问 .NET Core 中 CimCmdlets 模块中的 cmdlet。 具体来说,我希望能够使用 New-CimSessionOption 和 New-CimSession cmdlet。 NuGet 包 微软.NETCore.App v2.2.0 Microsoft.Powershell.SDK v6.2.2 简单演示 using System; using System.Management.Automation; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string str; using (var ps = PowerShell.Create()) { str = ""; var results = ps.AddScript("Get-Command").Invoke(); foreach (var result in results) { str += result.ToString() + ", "; } } Console.WriteLine(str); } } } 输出 A:, B:, C:, cd.., cd\, Clear-Host, D:, E:, F:, G:, H:, help, I:, J:, K:, L:, M
  • 即使在环境变量中定义了模块路径后,Powershell 模块也不加载(Powershell Module not loading even after the module path is defined in environment variables)
    问题 我在创建的文件夹 C:\PowerShellScripts\Modules 中有一个模块。 我称之为 mod.psm1。 该文件包含两个简单的函数:Write-hello 和 Write-bye。 现在,我已将此路径 (C:\PowerShellScripts\Modules) 添加到我的 PSModulePath 环境变量路径。 因此,这应该会在我启动 PowerShell 时自动加载模块。 正确的? 但是当我运行 PowerShell 并尝试 Write-hello 或 Write-bye 时,它​​会出现错误 write-hello :术语“write-hello”不被识别为 cmdlet、函数、脚本文件或可运行程序的名称 即使 $ENV:PSModulePath 显示我的路径 (C:\PowerShellScripts\Modules),PowerShell 也不会加载 mod.psm1 文件 我需要再次手动使用导入模块。 可能有什么问题? 回答1 根据此处提供的文档: “格式良好”的模块是存储在与模块目录中至少一个文件的基本名称同名的目录中的模块。 如果模块格式不正确,Windows PowerShell 不会将其识别为模块。 文件的“基本名称”是不带文件扩展名的名称。 在格式良好的模块中,包含模块文件的目录名称必须与模块中至少一个文件的基本名称匹配。
  • 调用命令错误“无法使用指定的命名参数解析参数集”(Invoke-Command error “Parameter set cannot be resolved using the specified named parameters”)
    问题 希望您能在尝试在本地计算机上使用备用凭据执行脚本块时遇到的问题对我有所帮助。 我一直在论坛上进行详尽的搜索并进行谷歌搜索,发现了两种可能的方法来解决我的问题: 使用调用命令使用开始作业 使用方法1,我有以下代码: $res = Invoke-Command -Credential $migratorCreds -ScriptBlock {param($one, $two) Get-LocalUsers -parentNodeXML $one -migratorUser $two } -ArgumentList $xmlPRE,$migratorCreds 其中, Get-LocalUsers是存储在自定义模块(* .psm1)中的自定义函数。 我的问题是,每次我运行此代码时,都会出现以下错误: 无法使用指定的命名参数解析参数集 因此很明显,我必须缺少一些东西,您能在这个主题上为我提供帮助吗? 提前致谢... 回答1 你有这个错误是因为-credential没有-computername不可能存在。 您可以这样尝试: Invoke-Command -Credential $migratorCreds -ScriptBlock ${function:Get-LocalUsers} -ArgumentList $xmlPRE,$migratorCreds -computername
  • 在自定义组件中使用离子输入(Using ion-input inside custom component)
    问题 我正在尝试在 angular2/ionic2 中创建一个包含输入的自定义组件,这是代码: import {Component} from "angular2/core"; import {ItemInput} from "ionic-framework/ionic"; @Component({ directives: [ItemInput], selector: "add-input", template: ` <ion-input clearInput> <input type="text" value=""> </ion-input> ` }) export class AddInput { constructor() { } } 问题是在最终页面/视图中似乎忽略了离子输入(没有应用样式,甚至无法点击它)。 如果我将代码按原样移动到主视图,则它可以工作。 当向这个自定义组件添加一个按钮时 <button>ok</button> 并导入 Button (并将其添加到此组件的指令列表中)这有效。 所以我不确定在自定义组件中使用的 ItemInput 组件是否需要做一些特殊的事情,或者我只是遇到了一个错误。 使用离子 2.0 alpha49。 有什么线索吗? 回答1 使用IONIC_DIRECTIVES导入离子指令: import {Component} from '
  • PowerShell:导入模块,但没有可用的“ExportedCommands”(PowerShell: Import-Module, but no “ExportedCommands” available)
    问题 当我使用 Import-Module -Name <path_to_local_dll> -Verbose DLL 文件中包含的 cmdlet 不会导出。 因此,当我键入Get-Module会列出我导入的模块,但没有任何 ExportedCommands。 为什么? ModuleType Name ExportedCommands ---------- ---- ---------------- Binary MyModule 在具有相同软件(PowerShell、.NET Framework 等)的第二台 PC 上,相同的导入 DLL 文件可以正常工作。 在那里我得到了 ExportedCommands。 这种行为取决于什么? 不幸的是, Import-Module cmdlet 没有表明它无法导入 cmdlet。 有没有办法得到它失败的原因? 回答1 两件事情: 确保您使用的是模块清单文件(.psd1 文件)。 更多信息可以在如何编写模块清单中找到最重要的是,编辑您的清单文件并确保它引用您的根模块,如下所示: RootModule = '你的模块名称' 我刚刚完成了几个小时的战斗,我无法弄清楚我的其他模块缺少什么。 这确实成功了! 回答2 可能是 psd1 文件(模块清单)不包含命令。 这个页面有一个关于如何创建模块清单的教程。 回答3 另一个要求:确保 cmdlet
  • 检测循环进口(Detecting circular imports)
    问题 我正在与一个包含大约30个唯一模块的项目一起工作。 它的设计不是很好,所以在向项目添加一些新功能时创建循环导入是很常见的。 当然,当我添加循环导入时,我并不知道它。 有时很明显,当我遇到类似AttributeError: 'module' object has no attribute 'attribute'的错误时,我已经进行了循环导入AttributeError: 'module' object has no attribute 'attribute' ,而我在其中明确定义了'attribute' 。 但有时,由于使用方式,代码不会引发异常。 所以,对我的问题: 是否可以以编程方式检测何时以及在何处进行循环导入? 到目前为止,我唯一想到的解决方案是拥有一个模块importTracking ,该模块包含一个字典importingModules ,一个函数importInProgress(file) ,递增importingModules[file] ,如果大于1则引发错误以及一个函数importComplete(file) ,以减少importingModules[file] 。 所有其他模块如下所示: import importTracking importTracking.importInProgress(__file__) #module code goes here
  • PowerShell cmdlet参数值选项卡完成(PowerShell cmdlet parameter value tab completion)
    问题 如何在PowerShell 3.0中为PowerShell函数或cmdlet(如Get-Service和Get-Process)实现参数选项卡完成? 我意识到ValidateSet适用于已知列表,但是我想按需生成列表。 亚当·德里斯科尔(Adam Driscoll)暗示有可能使用cmdlet,但遗憾的是尚未详细说明。 Trevor Sullivan展示了一种用于函数的技术,但是据我了解,他的代码仅在定义函数时生成列表。 回答1 检查github上的TabExpansionPlusPlus模块,该模块由以前的PowerShell团队魔术师编写。 https://github.com/lzybkr/TabExpansionPlusPlus#readme 回答2 我对此感到困惑了一段时间,因为我想做同样的事情。 我整理了一些我真的很满意的东西。 您可以从DynamicParam添加ValidateSet属性。 这是我从xml文件动态生成ValidateSet的示例。 请参见以下代码中的“ ValidateSetAttribute”: function Foo() { [CmdletBinding()] Param () DynamicParam { # # The "modules" param # $modulesAttributeCollection = new-object