下面是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。
1条答案
按热度按时间mqxuamgl1#
Where-Object
cmdlet(别名Where
)有两种不同的筛选模式-一种用于简单属性比较(也称为simplified syntax,这是您当前使用的),还有一个用于更复杂的过滤场景。对于后者,您需要提供一个脚本块,然后将其用作每个输入项的 predicate :
请注意,这并不等同于您当前的管道-为此,您需要使用
-and
操作符: