以下是 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。
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)
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |