当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 关于参数集

作者:精品下载站 日期:2024-12-14 02:20:51 浏览:14 分类:玩电脑

关于参数集


简短描述

描述如何在高级函数中定义和使用参数集。

详细描述

PowerShell 使用参数集使您能够编写可以针对不同场景执行不同操作的单个函数。参数集使您能够向用户公开不同的参数。并且,根据用户指定的参数返回不同的信息。您一次只能使用一组参数。

参数设置要求

以下要求适用于所有参数集。

  • 如果某个参数没有指定参数集,则该参数属于所有参数集。

  • 每个参数集必须具有唯一的参数组合。如果可能,至少一个唯一参数应该是强制参数。

  • 包含多个位置参数的参数集必须为每个参数定义唯一的位置。两个位置参数不能指定相同的位置。

  • 一组中只有一个参数可以声明值为 trueValueFromPipeline 关键字。多个参数可以定义值为 trueValueFromPipelineByPropertyName 关键字。

笔记

参数集的限制为 32 个。

默认参数集

定义多个参数集时,CmdletBinding 属性的 DefaultParameterSetName 关键字指定默认参数集。当 PowerShell 无法根据提供给命令的信息确定要使用的参数集时,它会使用默认参数集。有关 CmdletBinding 属性的详细信息,请参阅 about_Functions_CmdletBindingAttribute。

声明参数集

要创建参数集,您必须为参数集中的每个参数指定 Parameter 属性的 ParameterSetName 关键字。对于属于多个参数集的参数,请为每个参数集添加一个 Parameter 属性。

参数属性使您能够为每个参数集定义不同的参数。例如,您可以将参数在一组中定义为强制参数,而在另一组中定义为可选参数。但是,每个参数集必须至少包含一个唯一参数。

没有指定参数集名称的参数属于所有参数集。

示例

以下示例函数计算文本文件中的行数、字符数和单词数。使用参数,您可以指定要返回哪些值以及要测量哪些文件。定义了四个参数集:

  • 小路
  • PathAll
  • LiteralPath
  • 文字路径全部
function Measure-Lines {
    [CmdletBinding(DefaultParameterSetName = 'Path')]
    param (
        [Parameter(Mandatory, ParameterSetName = 'Path', Position = 0)]
        [Parameter(Mandatory, ParameterSetName = 'PathAll', Position = 0)]
        [string[]]$Path,

        [Parameter(Mandatory, ParameterSetName = 'LiteralPathAll', ValueFromPipeline)]
        [Parameter(Mandatory, ParameterSetName = 'LiteralPath', ValueFromPipeline)]
        [string[]]$LiteralPath,

        [Parameter(ParameterSetName = 'Path')]
        [Parameter(ParameterSetName = 'LiteralPath')]
        [switch]$Lines,

        [Parameter(ParameterSetName = 'Path')]
        [Parameter(ParameterSetName = 'LiteralPath')]
        [switch]$Words,

        [Parameter(ParameterSetName = 'Path')]
        [Parameter(ParameterSetName = 'LiteralPath')]
        [switch]$Characters,

        [Parameter(Mandatory, ParameterSetName = 'PathAll')]
        [Parameter(Mandatory, ParameterSetName = 'LiteralPathAll')]
        [switch]$All,

        [Parameter(ParameterSetName = 'Path')]
        [Parameter(ParameterSetName = 'PathAll')]
        [switch]$Recurse
    )

    begin {
        if ($All) {
            $Lines = $Words = $Characters = $true
        }
        elseif (($Words -eq $false) -and ($Characters -eq $false)) {
            $Lines  = $true
        }
    }
    process {
        if ($Path) {
            $Files = Get-ChildItem -Path $Path -Recurse:$Recurse -File
        }
        else {
            $Files = Get-ChildItem -LiteralPath $LiteralPath -File
        }
        foreach ($file in $Files) {
            $result = [ordered]@{ }
            $result.Add('File', $file.fullname)

            $content = Get-Content -LiteralPath $file.fullname

            if ($Lines) { $result.Add('Lines', $content.Length) }

            if ($Words) {
                $wc = 0
                foreach ($line in $content) { $wc += $line.split(' ').Length }
                $result.Add('Words', $wc)
            }

            if ($Characters) {
                $cc = 0
                foreach ($line in $content) { $cc += $line.Length }
                $result.Add('Characters', $cc)
            }

            New-Object -TypeName psobject -Property $result
        }
    }
}

每个参数集必须具有唯一的参数或唯一的参数组合。 PathPathAll 参数集非常相似,但 All 参数对于 PathAll 参数集是唯一的。对于 LiteralPathLiteralPathAll 参数集也是如此。即使 PathAllLiteralPathAll 参数集都具有 All 参数,PathLiteralPath

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯