Powershell 函数中指定的参数将自动传递给筛选器

Powershell 函数中指定的参数将自动传递给筛选器,powershell,powershell-3.0,Powershell,Powershell 3.0,我编写了一个函数和过滤器来分析CSV文件的内容 函数创建列对象的管道: function Analyze { [CmdletBinding()] Param( [String] $File ) # get column headers from CSV; enumerate $Headers = (Get-Content $File | Select-Object -Fir

我编写了一个函数和过滤器来分析CSV文件的内容

函数创建列对象的管道:

function Analyze {

        [CmdletBinding()]
        Param(
          [String]
          $File
        )

        # get column headers from CSV; enumerate
        $Headers = (Get-Content $File | Select-Object -First 1).Split(',')
        $Headers | ForEach-Object {

          # create an object that represents each column; initialize values
          $Column = [PsCustomObject]@{'Name'=$_;'Measurements'=@()}

          # add to pipeline
          $Column
        }

}
用于计算每列内容的最小值的筛选器:

filter Min {

    Param(
        [string]$File
    )

    # create Logparser query
    $Query = "SELECT Min($($_.Name)) AS Minimum FROM '$File'"

    # excute query; return results as XML
    [xml] $xml = & logparser $Query -stats:off -o:xml

    # create object to contain measurement and its value
    $Measurement=[PsCustomObject]@{'Name'='Minimum';Value=$xml.root.row.Minimum.Trim()}

    # add to collection and return to pipeline
    $_.Measurements+=$Measurement
    $_

}
filter Max {

    Param(
        [string]$File
    )

    # create Logparser query
    $Query = "SELECT Max($($_.Name)) AS Maximum FROM '$File'"

    # excute query; return results as XML
    [xml] $xml = & logparser $Query -stats:off -o:xml

    # create object to contain measurement and its value
    $Measurement=[PsCustomObject]@{'Name'='Maximum';Value=$xml.root.row.Maximum.Trim()}

    # add to collection and return to pipeline
    $_.Measurements+=$Measurement
    $_

}
用于计算每列内容的最小值的筛选器:

filter Min {

    Param(
        [string]$File
    )

    # create Logparser query
    $Query = "SELECT Min($($_.Name)) AS Minimum FROM '$File'"

    # excute query; return results as XML
    [xml] $xml = & logparser $Query -stats:off -o:xml

    # create object to contain measurement and its value
    $Measurement=[PsCustomObject]@{'Name'='Minimum';Value=$xml.root.row.Minimum.Trim()}

    # add to collection and return to pipeline
    $_.Measurements+=$Measurement
    $_

}
filter Max {

    Param(
        [string]$File
    )

    # create Logparser query
    $Query = "SELECT Max($($_.Name)) AS Maximum FROM '$File'"

    # excute query; return results as XML
    [xml] $xml = & logparser $Query -stats:off -o:xml

    # create object to contain measurement and its value
    $Measurement=[PsCustomObject]@{'Name'='Maximum';Value=$xml.root.row.Maximum.Trim()}

    # add to collection and return to pipeline
    $_.Measurements+=$Measurement
    $_

}
用法:

pushd C:\users\<user>\Desktop
$File = '.\d.csv'
Analyze -File $File | Min -File $File | Max -File $File
popd
pushd C:\users\<user>\Desktop
$File = '.\data.csv'
Analyze $File -Min -Max -Top
popd
pushd C:\users\\Desktop
$File='.\d.csv'
分析-文件$File |最小-文件$File |最大-文件$File
邻苯二胺
是否有一种设计过滤器的方法,我可以这样称呼它:

pushd C:\users\<user>\Desktop
Analyze -File '.\d.csv' | Min | Max
popd
pushd C:\users\\Desktop
分析-文件“.\d.csv”|最小值|最大值
邻苯二胺

根据@Mathias R.Jessen的评论,我重构了函数和过滤器:

function Analyze {

    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True,Position=1)]
        [alias('f')]
        [String]
        $File,

        [Switch] $Min,
        [Switch] $Max,
        [Switch] $Top
    )

    # get column headers from CSV; enumerate
    $Included = (Get-Content $File | Select-Object -First 1).Split(',')

    $Included | ForEach-Object {

        # create a hash that represents each column; initialize values
        $Column = [PsCustomObject]@{'Name'=$_;'Measurements'=@()}

        # apply specified filter; pass object via pipeline
        if ($Min) { $Column | Min -File $File }
        if ($Max) { $Column | Max -File $File }
        if ($Top) { $Column | Top -File $File }

        # add to pipeline
        $Column

    }

}
需要禁用过滤器的管道:

filter Min {

    [Parameter(Mandatory=$True,Position=1)]
    [alias('f')]
    Param(
        [string]$File
    )

    $Query = "SELECT Min([$($_.Name)]) AS Minimum FROM '$File'"

    [xml] $xml = & logparser $Query -stats:off -o:xml
    $Measurement=[PsCustomObject]@{'Name'='Minimum';Value=$xml.root.row.Minimum.Trim()}

    $_.Measurements+=$Measurement

    # pipeline disabled; created multiple instances of Column object
    #$_

}

# similar changes to these filters
filter Max {}
filter Top {}
用法:

pushd C:\users\<user>\Desktop
$File = '.\d.csv'
Analyze -File $File | Min -File $File | Max -File $File
popd
pushd C:\users\<user>\Desktop
$File = '.\data.csv'
Analyze $File -Min -Max -Top
popd
pushd C:\users\\Desktop
$File='.\data.csv'
分析$File-Min-Max-Top
邻苯二胺

您可以通过
Analyze
函数将文件属性添加到对象中。@PetSerAl,我考虑过这一点,但它看起来像是一个黑客。也许这是唯一的方法…如果你希望下一个函数使用它,你必须以某种方式将它返回到管道。@craig你是否考虑过将
-Min
-Max
参数添加到
分析中,而不是使用单独的过滤器?@MathiasR.Jessen,所以
-Min
-Max
开关
吗?如果为true,在
ForEach对象
循环中调用所需的过滤器?如果是这样,将过滤器重构为函数是否更有意义?