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
我有一个 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