powershell - 是否可以跨多个功能重用 'param' block ?

标签 powershell parameters

假设我有一个具有多个函数的脚本,这些函数采用完全相同的参数、相同的位置、相同的类型和约束,如下所示:

function Verb1-MyValue {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true)][String]$Param1,
        [parameter(Mandatory = $true)][String]$Param2,
        [ValidateSet("Value1","Value2")][String]$Param3 = "Value1"
    )
    # code ...
}

function Verb2-MyValue {
    [CmdletBinding()]
    param (
        [parameter(Mandatory = $true)][String]$Param1,
        [parameter(Mandatory = $true)][String]$Param2,
        [ValidateSet("Value1","Value2")][String]$Param3 = "Value1"
    )
    # code ...
}

# and so on ...

我想分享 param阻止所有功能以避免潜在问题(它们需要对所有功能都相同)并避免冗余。

PowerShell 中有没有办法共享 param在同一个脚本中阻止多个函数?如果没有,是否有任何替代方案?

最佳答案

如果可以,我建议您使用“构建 powershell 模块的 C# 项目”方法。根据您的情况,有多种好处,其中包括:

  • 编译时安全。我知道一些开发人员会更喜欢
    由于增加了安全性而编译的/强类型语言
  • 更容易编写自动化测试。这可能是有争议的,但在我的
    意见,拥有像 nUnit 和其他测试框架这样的库
    是一个巨大的优势
  • 语言熟悉度。我遇到过很多
    熟悉 c# 但不熟悉 powershell 的开发人员,所以他们
    斗争。

  • 要开始,我发现 this article .基本上,它说要添加对 的引用System.Management.Automation.dll 到您的项目,然后一个非常基本的 cmdlet 将如下所示:
    using System;
    using System.Collection.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Management.Automation;
    
    namespace MyModule
    {
        [Cmdlet(VerbsCommon.Get, "Saluation")]
        public class GetSaluation : PSCmdlet
        {
            private string[] nameCollection;
    
            [Parameter(
                Mandatory = true,
                ValueFromPipelineByPropertyName = true,
                ValueFromPipelin = true,
                Position = 0,
                HelpMessage = "Name to get salutation for."
            )]
            [Alias("Person", "FirstName")]
            public string[] Name
            {
                get { return nameCollection;}
                set { nameCollection = value;}
            }
    
            protected override void BeginProcessing()
            {
                base.BeginProcessing();
            }
    
            protected override void ProcessRecord()
            {
                foreach (string name in nameCollection)
                {
                    WriteVerbose("Creating salutation for " + name);
                    string salutation = "Hello, " + name;
                    WriteObject(salutation);
                }
            }
    
            protected override void EndProcessing()
            {
                base.EndProcessing();
            }
    
        }
    

    然后,要使用此模块,请打开 powershell 提示符,导航到构建 dll 的位置并使用 Import-Module cmdlet。

    然后对于您的特定问题( 如何使用不同的 cmdlet 重用 param block ? )您可以拥有一个定义参数的基本 cmdlet,并且您希望编写的所有 cmdlet 都可以从基础继承类(class)。

    关于powershell - 是否可以跨多个功能重用 'param' block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26910789/

    相关文章:

    powershell - Jenkins Powershell 输出

    Powershell Echo 语句 + 一行变量

    C# out参数值传递

    java - POST 请求不会使用 Struts 2 中的 ModelDriven 将表单值加载到模型中

    powershell - 如何循环显示pscustomobject?

    powershell - 如何从Powershell打开命令提示符

    powershell - 从 get-childitem 搜索中排除路径

    ios - Objective-c 方法调用将引用传递给调用者

    Javascript解析查询参数

    Java 选择性泛型