gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:40:37 26 4
gpt4 key购买 nike

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

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/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com