使用PowerShell筛选具有多个条件的CSV文件

cnh2zyt3  于 2023-05-11  发布在  Shell
关注(0)|答案(1)|浏览(177)

下面是CSV文件中的一个小数据示例,需要对该文件进行过滤,以删除包含分支102或Name equals Admin的所有行。
DataSource.csv

branch,ID,name
102,11056,Jones
103,11057,Henry
102,22000,Admin
103,22001,Admin
102,22002,White
103,22003,George

下面是我的PowerShell脚本demo.ps1的第一个版本,它可以工作-

$path = "C:\users\knot22\PowerShell"

Import-CSV "$($path)\DataSource.csv" | Where Branch -NotLike '*102*' | Where Name -NotLike '*Admin*' |
Export-CSV "$($path)\DataTarget.csv" -NoTypeInformation -UseQuotes Never

结果DataTarget.csv的输出是-

branch,ID,name
103,11057,Henry
103,22003,George

但是,我想修改demo.ps1,使条件位于单个Where块中。我试过这个

$path = "C:\users\knot22\PowerShell"

Import-CSV "$($path)\DataSource.csv" | Where Branch -NotLike '*102*' -or Name -NotLike '*Admin*' |
Export-CSV "$($path)\DataTarget.csv" -NoTypeInformation -UseQuotes Never

但它会导致一个错误
“无法绑定参数,因为多次指定了参数'NotLike'。若要为可接受多个值的参数提供多个值,请使用数组语法。例如,“-parameter value 1,value 2,value 3”。
此错误消息意味着多个条件用于一个参数。在上述用例中,多个条件适用于不同的参数。
有没有办法修改demo.ps1的第二个版本中的语法,它试图将条件与-and结合起来,以便成功运行?我希望保持语法简洁。
我用的是PowerShell 7。

mqxuamgl

mqxuamgl1#

Where-Object cmdlet(别名Where)有两种不同的筛选模式-一种用于简单属性比较(也称为simplified syntax,这是您当前使用的),还有一个用于更复杂的过滤场景。
对于后者,您需要提供一个脚本块,然后将其用作每个输入项的 predicate :

Where { $_.Branch -notlike '*102*' -or $_.Name -notlike '*Admin*' }

请注意,这并不等同于您当前的管道-为此,您需要使用-and操作符:

Where { $_.Branch -notlike '*102*' -and $_.Name -notlike '*Admin*' }

相关问题