21

我正在尝试过滤 CSV 文件。但是下面的脚本给出了一个错误。如何指定要在每个 String 对象上运行 match?

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

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

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

3 回答 3

31

尝试这个:

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

在上面的代码中,您没有在where子句中使用 $PSItem ($_),如果要使用通配符,则必须使用-like运算符:

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

或者

$FileNames|where{$_ -match ".csv"}
于 2013-01-05T14:40:27.613 回答
23

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

如果是标量,则返回布尔值。如果是数组,则返回数组中与模式匹配的所有元素

@($Filenames) -match '*.csv'

使用数组语法确保在Get-ChildItem. $True否则,如果匹配,您将返回而不是文件名。

于 2013-01-05T18:41:27.903 回答
10

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

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

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

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

然后得到你需要的位

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

ETC

于 2019-10-14T10:47:02.807 回答