使用 PowerShell 过滤具有多个条件的 CSV 文件

kno*_*t22 2 csv powershell

以下是 CSV 文件中的一小部分数据示例,需要对其进行过滤以删除包含 Branch 102 或名称等于 Admin 的所有行。

数据源.csv

branch,ID,name
102,11056,Jones
103,11057,Henry
102,22000,Admin
103,22001,Admin
102,22002,White
103,22003,George
Run Code Online (Sandbox Code Playgroud)

这是我的 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
Run Code Online (Sandbox Code Playgroud)

DataTarget.csv 的输出结果是 -

branch,ID,name
103,11057,Henry
103,22003,George
Run Code Online (Sandbox Code Playgroud)

但是,我想修改 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
Run Code Online (Sandbox Code Playgroud)

但这会导致错误

“无法绑定参数,因为多次指定参数“NotLike”。要为可以接受多个值的参数提供多个值,请使用数组语法。例如,“-参数 value1,value2,value3”。

此错误消息意味着多个条件适用于一个参数。在上面的用例中,多个条件适用于不同的参数。

有没有办法修改 demo.ps1 第二个版本中的语法,尝试将条件组合起来,-and以便它成功运行?我希望保持语法简洁。

另外,我正在使用 PowerShell 7。

Mat*_*sen 5

cmdlet (别名)有两种不同的过滤模式 - 一种用于简单的属性比较(又名简化语法,Where-Object就是您当前正在使用的),另一种用于更复杂的过滤场景。Where

对于后者,您需要提供一个脚本块,然后将其用作每个输入项的谓词:

Where { $_.Branch -notlike '*102*' -or $_.Name -notlike '*Admin*' }
Run Code Online (Sandbox Code Playgroud)

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

Where { $_.Branch -notlike '*102*' -and $_.Name -notlike '*Admin*' }
Run Code Online (Sandbox Code Playgroud)