使用 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 上给定的值。