是否可以在多个函数中重用"param"块?

jul*_*gon 7 parameters powershell

假设我有一个带有多个函数的脚本,它们采用完全相同的参数,位于相同的位置,并且具有相同的类型和约束,如下所示:

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 ...
Run Code Online (Sandbox Code Playgroud)

我想param与所有函数共享块以避免潜在的问题(它们需要对所有函数都相同)并避免冗余.

PowerShell中是否有一种方法可以在param同一个脚本中跨多个函数共享块?如果没有,有什么替代品吗?

Tra*_*vis 4

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

  1. 编译时安全。我知道一些开发人员更喜欢编译/强类型语言,因为这样可以增加安全性
  2. 更容易编写自动化测试。这可能是有争议的,但在我看来,拥有像 nUnit 和其他测试框架这样的库是一个巨大的优势
  3. 语言熟悉程度。我遇到过许多熟悉 c# 但不熟悉 powershell 的开发人员,所以他们很挣扎。

首先,我找到了这篇文章基本上,它表示将对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();
        }

    }
Run Code Online (Sandbox Code Playgroud)

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

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