使用 Powershell 在字符串中查找字符?
Find a character in a string using Powershell?
我知道我可以使用 Contains
找到它,但它不起作用。
全文:
我必须从 SQl db 获取 PartNo、Ver、Rev 并检查它们是否出现在文本文件的第一行中。我得到文件的第一行并将其存储在 $EiaContent
中。
PartNo 与 MAFN 相关联,如 $partNo=Select PartNo Where MAFN=xxx.
大多数情况下,MAFN returns 一个 PartNo。但在某些情况下,一个 MAFN 可能有多个 PartNo。所以查询 returns 多个 PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4) 但只有其中一个会在文本文件中。
问题是这些零件号中的每一个。在 PowerShell 中被视为单个字符。 $partNo.Length
是 4。因此,我的检查 If ($EiaContent.Contains("*$partNo*"))
失败了,在这种情况下不应该,因为我可以看到文件中提到了其中一个 PartNo。此外,如果只有一个 PartNo,Contains
将不起作用。我像在 If ($EiaContent -like "*$partNo*")
中一样使用 like
来匹配 PartNo 并且它有效,但是当有多个 PartNo 时它不起作用。
$partNo
的数据类型是字符串,$EiaContent
也是。 PartNo. 的数据类型在 SQL 中是 varchar(50) 排序规则是 COLLATE SQL_Latin1_General_CP1_CI_AS
我使用的是 PowerShell Core 7.2 和 SQL 2005
代码:
$EiaContent = (Get-Content $aidLibPathFolder$folderName$fileName -TotalCount 1)
Write-host $EiaContent
#Sql query to get the Part Number
$partNoQuery = "SELECT PartNo FROM [NML_Sidney].[dbo].[vMADL_EngParts] Where MAFN = $firstPartTrimmed"
$partNoSql = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $partNoQuery
#Eliminate trailing spaces
$partNo = $partNoSql.PartNo.Trim()
If ($EiaContent.Contains("*$partNo*")) {
Write-Host "Part Matches"
}
Else {
#Send an email stating the PartNo discrepancy
}
提前感谢那些试图提供帮助的人。
编辑
截屏
[1]: https://i.stack.imgur.com/hIqJB.png
A1023 A1023MD C0400 C0400MD
是变量$partNo
的输出,O40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )
是变量$EiaContent
的输出
So the query returns multiple PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4) but only one of these will be in the text file.
A1023 A1023MD C0400 C0400MD
is the output of the variable $partNo
and O40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )
is the output of the variable $EiaContent
所以你首先必须 split $partNo
然后对于 $partNo
的每个子字符串,在 $EiaContent
:
中搜索它
If ($partNo -split ' ' | Where-Object { $EiaContent.Contains( $_ ) }) {
Write-Host "Part Matches"
}
这是大多数人习惯的通用形式。我们可以使用 -split
的一元形式(因为我们在默认分隔符上拆分)来简化查询,并使用内部数组方法 .Where()
,因为它不涉及管道开销,所以速度更快。
If ((-split $partNo).Where{ $EiaContent.Contains( $_ ) }) {
Write-Host "Part Matches"
}
正确 , wildcards are not supported by the .Contains()
字符串方法。
仅 PowerShell -like
运算符支持通配符。以下示例仅用于教育目的,我不会在您的情况下使用它,因为 .Contains()
字符串方法更简单、更快。
If ((-split $partNo).Where{ $EiaContent -like "*$EiaContent*" }) {
Write-Host "Part Matches"
}
注意 -contains
不 适合这里。一个常见的误解是,当 LHS 操作数是字符串时,-contains
执行子字符串搜索。它没有!运算符测试 LHS 上的 collection(例如数组)是否包含 RHS 上给定的值。
我知道我可以使用 Contains
找到它,但它不起作用。
全文:
我必须从 SQl db 获取 PartNo、Ver、Rev 并检查它们是否出现在文本文件的第一行中。我得到文件的第一行并将其存储在 $EiaContent
中。
PartNo 与 MAFN 相关联,如 $partNo=Select PartNo Where MAFN=xxx.
大多数情况下,MAFN returns 一个 PartNo。但在某些情况下,一个 MAFN 可能有多个 PartNo。所以查询 returns 多个 PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4) 但只有其中一个会在文本文件中。
问题是这些零件号中的每一个。在 PowerShell 中被视为单个字符。 $partNo.Length
是 4。因此,我的检查 If ($EiaContent.Contains("*$partNo*"))
失败了,在这种情况下不应该,因为我可以看到文件中提到了其中一个 PartNo。此外,如果只有一个 PartNo,Contains
将不起作用。我像在 If ($EiaContent -like "*$partNo*")
中一样使用 like
来匹配 PartNo 并且它有效,但是当有多个 PartNo 时它不起作用。
$partNo
的数据类型是字符串,$EiaContent
也是。 PartNo. 的数据类型在 SQL 中是 varchar(50) 排序规则是 COLLATE SQL_Latin1_General_CP1_CI_AS
我使用的是 PowerShell Core 7.2 和 SQL 2005
代码:
$EiaContent = (Get-Content $aidLibPathFolder$folderName$fileName -TotalCount 1)
Write-host $EiaContent
#Sql query to get the Part Number
$partNoQuery = "SELECT PartNo FROM [NML_Sidney].[dbo].[vMADL_EngParts] Where MAFN = $firstPartTrimmed"
$partNoSql = Invoke-Sqlcmd -ServerInstance $server -Database $database -Query $partNoQuery
#Eliminate trailing spaces
$partNo = $partNoSql.PartNo.Trim()
If ($EiaContent.Contains("*$partNo*")) {
Write-Host "Part Matches"
}
Else {
#Send an email stating the PartNo discrepancy
}
提前感谢那些试图提供帮助的人。
编辑 截屏 [1]: https://i.stack.imgur.com/hIqJB.png
A1023 A1023MD C0400 C0400MD
是变量$partNo
的输出,O40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )
是变量$EiaContent
So the query returns multiple PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4) but only one of these will be in the text file.
A1023 A1023MD C0400 C0400MD
is the output of the variable$partNo
andO40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )
is the output of the variable$EiaContent
所以你首先必须 split $partNo
然后对于 $partNo
的每个子字符串,在 $EiaContent
:
If ($partNo -split ' ' | Where-Object { $EiaContent.Contains( $_ ) }) {
Write-Host "Part Matches"
}
这是大多数人习惯的通用形式。我们可以使用 -split
的一元形式(因为我们在默认分隔符上拆分)来简化查询,并使用内部数组方法 .Where()
,因为它不涉及管道开销,所以速度更快。
If ((-split $partNo).Where{ $EiaContent.Contains( $_ ) }) {
Write-Host "Part Matches"
}
正确 .Contains()
字符串方法。
仅 PowerShell -like
运算符支持通配符。以下示例仅用于教育目的,我不会在您的情况下使用它,因为 .Contains()
字符串方法更简单、更快。
If ((-split $partNo).Where{ $EiaContent -like "*$EiaContent*" }) {
Write-Host "Part Matches"
}
注意 -contains
不 适合这里。一个常见的误解是,当 LHS 操作数是字符串时,-contains
执行子字符串搜索。它没有!运算符测试 LHS 上的 collection(例如数组)是否包含 RHS 上给定的值。