2

我正在尝试拥有一个可以根据我将传递参数的最新状态值来计算作业的函数。到目前为止,我得到了什么:

Function JobCountStatus {
  Write-Output (Get-VBRJob | ?{$_.Info.LatestStatus -eq $args} | Measure-Object).Count
}

问题是,正如我在某处读到的那样,将会有一个子shell(?)执行 where 所以参数不会被传递。

如果我用“失败”之类的特定字符串替换 $args,它将起作用。

有没有办法克服这个问题?我不想为所有可能的值编写单独的函数。

我会很感激任何意见 - 谢谢

4

2 回答 2

3

好吧,您可以在运行函数时将值命名为$args自动变量

JobCountStatus "Failed"

您可以使用带有参数的高级函数,无论是否命名:

function JobCountStatus {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [System.String]
        $Status
    )
    Process {
        (Get-VBRJob | Where-Object { $_.Info.LatestStatus -eq $Status } | Measure-Object).Count
    }
}

并这样称呼它:

JobCountStatus -Status "Failed"

# OR

JobCountStatus "Failed"

后者的最终结果与使用$args. 在这里指定您自己的参数的唯一可能的好处是您可以定义状态的ValidateSet或状态值的 Enum,以便您可以通过它们进行选项卡。前者的一个例子是这样的:

function JobCountStatus {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, Position = 0)]
        [ValidateSet("Failed", "Running", "Successful", "Unknown")]
        [System.String]
        $Status
    )
    Process {
        (Get-VBRJob | Where-Object { $_.Info.LatestStatus -eq $Status } | Measure-Object).Count
    }
}
于 2021-09-02T20:34:42.623 回答
2

$args是一个数组,而不是单个值。在任何情况下, aScriptBlock {}都是一个未命名的函数,并且$args在其中有它自己的含义,所以你不能在没有像Where-Object. 您必须将 的元素存储$args为另一个变量或多个变量以在 child 中引用ScriptBlock。对于这个函数来说不是一个巨大的变化,但对于一个需要更多参数的函数来说,这可能会导致大量不必要的代码,这些代码可能难以维护。


我更喜欢建议在大多数情况下定义命名参数,这比让父$args级在子级中工作更简单ScriptBlock

Function JobCountStatus {
  Param(
    [string]$Status
  )
  ( Get-VBRJob | Where-Object { $_.Info.LatestStatus -eq $Status } ).Count
}

我还对这个函数做了一些改动,我将在下面解释:

  • 用于Param()按名称强定义参数。您可以使用更简单的语法,function JobCountStatus([string]$Status) {}但在这种情况下,使用哪种技术实际上是一个偏好问题。Param()作为惯例,我建议使用 using ,但您需要使用任何一种技术来获取命名参数
  • $args$Status.
  • 你的使用Measure-Object是无关的,所以我把它删除了。Where-Object返回一个已经具有该Count属性的集合。
  • 您可以?根据需要使用,但最好的做法是在脚本和模块中省略别名并使用完整的 cmdlet 名称,因此我已将其替换?Where-Object.

请注意,您可以使用或不使用参数来调用函数/cmdlet(PowerShell 定义的 cmdlet 差异很小),因为当您未定义位置顺序时,顺序会自动按照声明的顺序确定:

# Either will work
JobCountStatus -Status Running
JobCountStatus Running

以下是一些您可能会觉得有用的文档:

@Ash 的回答提供了一些更高级的示例,说明您可以使用上面param()高级功能链接中提到的内容。您不能将高级参数属性与我在第一个要点中提到的简单函数语法一起使用。

于 2021-09-02T20:34:28.653 回答