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

Abh*_*gre 10 powershell

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

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

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

$FileNames = $FileNames | Where { -match "*.csv"}
Run Code Online (Sandbox Code Playgroud)

Loï*_*HEL 20

试试这个:

$FileNames = Get-ChildItem -Path "C:\Users\anagre\Desktop" -Filter *.csv
Run Code Online (Sandbox Code Playgroud)

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

$FileNames|where{$_ -like "*.csv"}
Run Code Online (Sandbox Code Playgroud)

要么

$FileNames|where{$_ -match ".csv"}
Run Code Online (Sandbox Code Playgroud)

  • - 匹配搜索输入中任意位置的模式,因此您不必指定 * (2认同)

小智 9

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

$filename.where{$_ -match '.csv'}
Run Code Online (Sandbox Code Playgroud)

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

$filename.where{$_.location -match '.csv'}
Run Code Online (Sandbox Code Playgroud)

然后得到你需要的位

$filename.where{$_.location -match '.csv'} | select User,Filename,Filetype
Run Code Online (Sandbox Code Playgroud)

等等


mjo*_*nor 7

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

如果它是标量,则返回布尔值.如果它是一个数组,它将返回与该模式匹配的数组的所有元素

@($Filenames) -match '*.csv'
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是公认的答案!因为这将始终返回一个数组.在`$ f |?{...}`case,返回值将自动取消装箱. (2认同)