1

我正在尝试从 csv 中过滤掉包含数组中任何值的行。

使用这篇文章作为参考: Use -notlike to filter out multiple strings in PowerShell

我设法让它使用这种格式:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2a}*" 
      -and $_."SubmitterName" -notlike "*${Report2b}*" 
      -and $_."SubmitterName" -notlike "*${Report2c}*"} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

最终,我计划重写脚本,以便从最终用户生成的文本文件中提取排除列表。为此,我必须让它访问数组中的值。我尝试使用以下语法来做到这一点,但它没有按预期工作:

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notlike "*${Report2[0]}*" 
      -and $_."SubmitterName" -notlike "*${Report2[1]}*" 
      -and $_."SubmitterName" -notlike "*${Report2[2]}*"} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

我觉得这只是一个语法问题,但是在玩了太久之后,我已经没有想法了。我感觉这是语法问题

4

2 回答 2

0

你也可以像这样使用包含

精简版

[string[]]$listexludevalue=Get-Content "C:\temp\exludevalue.txt"
Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | %{$valcontain=$true; $col=$_.Owner; $listexludevalue.ForEach({$valcontain=$valcontain -and !$col.Contains($valuetotest)}); if ($valcontain) {$_} } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

详细版:

$listexludevalue=Get-Content "C:\temp\exludevalue.txt"

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
% {

    $valcontain=$true

    foreach ($valuetotest in $listexludevalue) {$valcontain=$valcontain -and !$_.SubmitterName.Contains($valuetotest)}

    if ($valcontain) {$_}

   } | Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation
于 2016-11-16T20:16:18.107 回答
0

这是一个语法问题。该${Name}语法主要用于包含奇数字符的名称,例如${A ~*Strange*~ Variable Name}. 虽然它不是一个表达式,所以你不能用[0]大括号来索引它;这将被视为变量名称的文字部分。

相反,您可以使用子表达式$(...)来执行此操作:

"*$($Report2[0])*"

作为一种替代方法,我可能会将您的整个数组转换为单个正则表达式,然后使用-match(or -notmatch) 运算符:

$regex = $Report2.ForEach({ [RegEx]::Escape($_) }) -join '|'

Import-Csv "$LocalPath\Stripped1Acct$abbrMonth$Year.csv" | 
    where {$_."SubmitterName" -notmatch $regex} |
    Export-Csv "$LocalPath\Stripped2Acct$abbrMonth$Year.csv" -NoTypeInformation

这需要$Report2数组,然后构建一个具有相同值的数组,但为正则表达式转义(以便任何特殊字符都按字面意思匹配),然后构建一个如下所示的正则表达式:

Item1|Item2|Item3

Item1 在 RegEx 中,管道是交替的,因此它会查找or 等​​的匹配项Item2。Regex 会在字符串中的任何位置找到它,因此它不需要通配符-like

因此,通过预先包含数组中的所有项目,您可以使用它-notmatch来实现相同的目标,而不必对一堆索引进行硬编码。

于 2016-11-16T19:20:33.527 回答