使用Contains
PowerShell 查找值不起作用。
完整故事:
我必须从 SQL DB 获取PartNo
、Ver
和Rev
值,并检查这些值是否出现在文本文件的第一行中。我获取文件的第一行并将其存储在中$EiaContent
。PartNo
与相关联,MAFN
如中所示$partNo=Select PartNo Where MAFN=xxx
。大多数情况下MAFN
返回一个PartNo
。但在某些情况下,对于一个,MAFN
可能会有多个PartNo
。因此查询返回多个PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4)
,但其中只有一个会出现在文本文件中。
问题是在 PowerShell 中,每个PartNo
. 都被视为单个字符。$partNo.Length
是4
。因此,我的检查失败了,但在这种情况下它不应该失败,因为我可以看到文件中提到了If ($EiaContent.Contains("*$partNo*"))
之一。此外,如果有一个 ,它将不起作用。我使用 like as 来匹配并且它起作用了,但是当有多个 时它不起作用。PartNo
Contains
PartNo
If ($EiaContent -like "*$partNo*")
PartNo
PartNo
我努力了:
If ($partNo.Contains($EiaContent)){}
但If ($partNo -like "*$EiaContent*"){}
这些都不起作用。
的数据类型$partNo
是字符串, 也是。 SQL 中$EiaContent
的 的数据类型是排序规则是,我使用的是 PowerShell Core 7.2 和 SQL 2005PartNo
varchar(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()
将$partNo
SQL 结果值转换为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
}
};
支持资源
-
钥匙
strSeparator
用于拆分每个字符串的字符, 默认空格(空格/换行符/制表符) -
标准别名对于 Foreach 对象:'
%
' 符号,ForEach