簡體   English   中英

定義 PowerShell 模塊中所有函數通用的參數

[英]Defining parameters common to all functions within a PowerShell module

我正在編寫一個 PowerShell 模塊,該模塊中的函數有一些參數將在所有函數中重復使用。 我不想在每次添加新函數時都復制粘貼函數定義,而是想像腳本變量一樣在頂部定義它們,然后將它們插入到每個函數中,以便在需要更改時給我一個更新位置.

查看動態參數的定義方式,似乎我應該能夠定義該類型的對象,然后在函數定義中引用它,但我無法在網上找到任何給我正確語法的信息。

使用 PowerShell 版本 7.2

$Script:ReUsedParameters = param(
    [Parameter()]
    [String]$Name,
    [Parameter()]
    [Int]$Id
)


Function New-Command {
    Param ($ReUsedParameters)

    Write-Output "Name: $Name, ID: $ID"
}

為了回答,您可以將運行時參數定義存儲在腳本塊中,然后在函數的dynamicparam調用它&

我認為這不是一個好主意,也不推薦使用它。 如果需要,所有函數都應該有自己的重復param塊。

$reusedParameters = {
    $paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()

    # Since both parameters don't have any arguments (Mandatory, Position, ValueFromPipeline, etc..)
    # you can use this one for both, otherwise, each dynamic parameter should have their own
    # Parameter Declaration
    [Parameter[]] $paramAttribute = [Parameter]::new()

    $paramDictionary['Name'] = [System.Management.Automation.RuntimeDefinedParameter]::new('Name', [string], $paramAttribute)
    $paramDictionary['Id'] = [System.Management.Automation.RuntimeDefinedParameter]::new('Id', [int], $paramAttribute)

    return $paramDictionary
}

Function New-Command {
    [CmdletBinding()] # `CmdletBinding` is Mandataroy here
    param()           # if the `param` block is empty

    dynamicparam {
        & $reusedParameters
    }

    end {
        # Caveat: you can reference these parameters via $PSBoundParameters
        #         $Name and $Id are not part of the `param` block
        #         hence that wouldn't work here
        "Name: {0}, ID: {1}" -f $PSBoundParameters['Name'], $PSBoundParameters['ID']
    }
}

New-Command -Name asd -Id 123

作為一種聲明式方法,您可以將公共參數轉換為屬性,並擁有一個類類型的函數參數。

class MyReUsedParameters {
    [String] $Name
    [Int] $Id = 23
}

Function New-Command {
    Param (
        [MyReUsedParameters] $ReUsedParameters,
        $AnotherParam
    )

    Write-Output "Name: $($ReUsedParameters.Name), ID: $($ReUsedParameters.ID)"
}

New-Command -ReUsedParameters @{ Name = 'foo'; Id = 42 } -AnotherParam bar

傳遞具有匹配屬性的hashtablePSCustomObject時,它將自動轉換為類類型。

您甚至可以驗證類似於常規參數的類屬性。 大多數參數驗證屬性也可以為類屬性指定。

class MyReUsedParameters {
    [ValidateNotNullOrEmpty()] [String] $Name
    [Int] $Id = 23

    # Constructor - required to apply validation
    MyReUsedParameters( [Hashtable] $ht ) {
        $this.Name = $ht.Name
        $this.Id = $ht.Id
    }
}

Function New-Command {
    Param (
        [Parameter(Mandatory)] 
        [MyReUsedParameters] $ReUsedParameters
    )

    Write-Output "Name: $($ReUsedParameters.Name), ID: $($ReUsedParameters.ID)"
}

# Causes an error (as expected), because Name property is missing
New-Command -ReUsedParameters @{ Id = 42 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM