Powershell Select-字符串变量问题

Powershell Select-String Problem with variable

我有一个 CSV 数字列表,我想使用 Select-String 到 return 字符串所在文件的名称。

当我这样做时

$InvoiceList = Import-CSV "C:\invoiceList.csv"
Foreach ($invoice in $InvoiceList) 
        {
            $orderFilename = $FileList | Select-String -Pattern "3505343956" | Select Filename,Pattern
            $orderFilename
        }

它给了我一个回应,我意识到它在循环中,但它给了我一个回应(虽然很多次)。这就是我想要的。

订单# 199450619.pdf.txt 3505343956 订单号 199450619.pdf.txt 3505343956

但是,当我 运行 这个:

$InvoiceList = Import-CSV "C:\invoiceList.csv"
Foreach ($invoice in $InvoiceList) 
        {
            $orderFilename = $FileList | Select-String -Pattern "$invoice" | Select Filename,Pattern
            $orderFilename
        }

或这个

$InvoiceList = Import-CSV "C:\invoiceList.csv"
Foreach ($invoice in $InvoiceList) 
        {
            $orderFilename = $FileList | Select-String -Pattern $invoice | Select Filename,Pattern
            $orderFilename
        }

我在 return.

中一无所获

我知道 $invoice 中有数据,因为如果我只输出 $invoice,我会得到 CSV 中的所有发票编号。

我做错了什么?

由于 $InvoiceList 包含 Import-Csv 调用的输出,因此它包含 自定义对象 以 CSV 列命名的属性,不是 strings.

因此,您必须显式访问包含发票编号(作为字符串)的 属性,以便将其用作 Select-String 的搜索模式。

假设感兴趣的属性/列名是InvoiceNum(根据需要调整):

Foreach ($invoice in $InvoiceList.InvoiceNum) { # Note the .InvoiceNum
  $FileList | Select-String -Pattern $invoice | Select Filename,Pattern
}

注:

  • 即使 $InvoiceList 包含对象的 数组 ,PowerShell 允许您访问仅存在于 元素上的 属性 数组(此处为 .InvoiceNum),并得到 元素的 属性 值作为结果 - 这个方便的功能称为 member-access enumeration.

但是,请注意 Select-String-Pattern 参数接受 数组 搜索模式,因此您可以缩短命令如下,这也提高性能:

$FileList |
  Select-String -Pattern (Import-Csv C:\invoiceList.csv).InvoiceNum |
    Select-Object Filename,Pattern