Powershell 函数中指定的参数将自动传递给筛选器
我编写了一个函数和过滤器来分析CSV文件的内容 函数创建列对象的管道: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
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对象
循环中调用所需的过滤器?如果是这样,将过滤器重构为函数是否更有意义?