如何使用 Powershell 在字符串中查找字符?

如何使用 Powershell 在字符串中查找字符?

使用ContainsPowerShell 查找值不起作用。

完整故事:

我必须从 SQL DB 获取PartNoVerRev值,并检查这些值是否出现在文本文件的第一行中。我获取文件的第一行并将其存储在中$EiaContentPartNo与相关联,MAFN如中所示$partNo=Select PartNo Where MAFN=xxx。大多数情况下MAFN返回一个PartNo。但在某些情况下,对于一个,MAFN可能会有多个PartNo。因此查询返回多个PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4),但其中只有一个会出现在文本文件中。

问题是在 PowerShell 中,每个PartNo. 都被视为单个字符。$partNo.Length4。因此,我的检查失败了,但在这种情况下它不应该失败,因为我可以看到文件中提到了If ($EiaContent.Contains("*$partNo*"))之一。此外,如果有一个 ,它将不起作用。我使用 like as 来匹配并且它起作用了,但是当有多个 时它不起作用。PartNoContainsPartNoIf ($EiaContent -like "*$partNo*")PartNoPartNo

我努力了:

If ($partNo.Contains($EiaContent)){}If ($partNo -like "*$EiaContent*"){}这些都不起作用。

的数据类型$partNo是字符串, 也是。 SQL 中$EiaContent的 的数据类型是排序规则是,我使用的是 PowerShell Core 7.2 和 SQL 2005PartNovarchar(50)COLLATE SQL_Latin1_General_CP1_CI_AS

我已经在这个问题上纠结了一段时间在此处输入图片描述已经有几天了,所以任何帮助都会受到赞赏。

完整代码:

$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 
}

变量输出值示例

  • 变量$partNo等于A1023 A1023MD C0400 C0400MD
  • 变量$EiaContent等于O40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )

答案1

返回的 SQL 查询结果是一个长字符串,每个值之间用空格连接。使用 PowerShell 将此结果保存为变量会将该长字符串保存为其值。

使用split()$partNoSQL 结果值转换为array.然后使用foreach-object针对$partNo其每个值进行迭代,以检查其中是否包含 $EiaContent您喜欢的值。

对于最小的改变根据您现有的逻辑:

全新逻辑调整

$partNo = $partNo.Split().Trim();
$partNo | % {
    If ( $EiaContent.Contains( $_ ) ) {
       Write-Host "Part Matches"
    }
    Else {
        Write-Host "Part Doesn't Match"
       #Send an email stating the PartNo discrepancy 
    }
};

完整脚本示例

$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 = $partNo.Split().Trim();
$partNo | % {
        If ( $EiaContent.Contains( $_ ) ) {
           Write-Host "Part Matches"
        }
        Else {
            Write-Host "Part Doesn't Match"
           #Send an email stating the PartNo discrepancy 
        }
    };

支持资源

相关内容