如何使用“匹配”cmdlet在PowerShell中过滤字符串数组(或列表)?

时间:2013-01-05 14:11:58

标签: powershell

我正在尝试过滤CSV文件。但是以下脚本发出错误。如何指定我想在每个String对象上运行匹配?

我尝试了各种组合,但没有结果。

$FileNames = [System.IO.Directory]::GetFiles("C:\Users\anagre\Desktop")

$FileNames = $FileNames | Where { -match "*.csv"}

3 个答案:

答案 0 :(得分:17)

试试这个:

$FileNames = Get-ChildItem -Path "C:\Users\anagre\Desktop" -Filter *.csv

在上面的代码中,你没有在where子句中使用$ PSItem($ _),如果你想使用wildchar,你必须使用-like运算符:< / p>

$FileNames|where{$_ -like "*.csv"}

$FileNames|where{$_ -match ".csv"}

答案 1 :(得分:7)

-match运算符既是比较运算符又是数组运算符,具体取决于其输入对象。

如果是标量,则返回布尔值。如果它是一个数组,它将返回与模式

匹配的数组的所有元素
@($Filenames) -match '*.csv'

如果Get-ChildItem只返回一个文件名,请使用数组语法确保仍然获得数组。否则,如果匹配,您将返回$True而不是文件名。

答案 2 :(得分:1)

我发现最简单(也是最简洁)的方法如下:

$filename.where{$_ -match '.csv'}

或仅在哈希表的给定列中搜索

$filename.where{$_.location -match '.csv'}

然后只得到您需要的位

$filename.where{$_.location -match '.csv'} | select User,Filename,Filetype