Usar Contains
para localizar um valor usando o PowerShell não está funcionando.
História completa:
Eu tenho que obter os valores PartNo
, Ver
e Rev
de um banco de dados SQL e verificar se esses valores ocorrem na primeira linha do arquivo de texto. Eu recebo a primeira linha do arquivo e armazeno em $EiaContent
. O PartNo
está associado MAFN
como em $partNo=Select PartNo Where MAFN=xxx
. Na maioria das vezes MAFN
retorna um PartNo
. Mas em alguns casos para um MAFN
pode haver vários PartNo
. Portanto, a consulta retorna vários PartNo(PartNo_1,PartNo_2,PartNo_3,and PartNo_4)
, mas apenas um deles estará no arquivo de texto.
A questão é que cada um desses PartNo
. é tratado como um único caractere no PowerShell. $partNo.Length
é 4
. Portanto, minha verificação If ($EiaContent.Contains("*$partNo*"))
falha e não deveria neste caso, porque posso ver que um dos PartNo
é mencionado no arquivo. Além disso, Contains
não funcionaria se houvesse um PartNo
. Eu uso como If ($EiaContent -like "*$partNo*")
para corresponder ao PartNo
e funcionou, mas não funciona quando há vários arquivos PartNo
.
Eu tentei:
If ($partNo.Contains($EiaContent)){}
e If ($partNo -like "*$EiaContent*"){}
mas nenhum destes também funciona.
O tipo de dados de $partNo
é uma string e também $EiaContent
. O tipo de dados do PartNo
SQL é o varchar(50)
agrupamento COLLATE SQL_Latin1_General_CP1_CI_AS
e estou usando o PowerShell Core 7.2 e o SQL 2005
Eu estive preso nisso para inserir a descrição da imagem aqui alguns dias agora, então qualquer ajuda é apreciada.
Código Completo:
$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
}
Valores de saída de variável de exemplo
- Variável
$partNo
igual aA1023 A1023MD C0400 C0400MD
- Variável
$EiaContent
igual aO40033( C0400 REV N VER 004, 37 DIA 4.5 BRAKE DRUM OP3 )
O resultado da consulta SQL retornado é uma string longa com espaço em branco concatenando cada valor. Salvar esse resultado como uma variável com o PowerShell salva essa string longa como seu valor.
Use
split()
na$partNo
variável para transformar os valores do resultado SQL em um arquivoarray
. Em seguida, useforeach-object
contra$partNo
para iterar sobre cada um de seus valores para verificar se algum deles está contido$EiaContent
como você preferir.Exemplo de script completo
Recursos de apoio
Dividir()
Matrizes
ForEach-Object
Se