GOOGLE ADS

vendredi 29 avril 2022

Comment comparer les packages dotnet et txt

j'ai le script:

$Test = (dotnet list C:\Tasks.Api.csproj package) et il fournit quelques packages (AVEC 2 ESPACES À LA FIN !) :

Project 'Tasks.Api' has the following package references 
[net5.0]:
Top-level Package Requested Resolved
> AspNetCore.HealthChecks.SqlServer 6.0.0 6.0.0
> Microsoft.ApplicationInsights.AspNetCore 2.18.0 2.18.0
> Microsoft.EntityFrameworkCore.Tools 5.0.11 5.0.11
> Swashbuckle.AspNetCore 6.2.3 6.2.3
(SPACE)
(SPACE)

gettype provide next:

entrez la description de l'image ici

Ensuite, j'ai un "bon" fichier (txt):

AspNetCore.HealthChecks.SqlServer
Microsoft.ApplicationInsights.AspNetCore

Maintenant, je veux savoir si mon "bon" fichier contient des lignes de $Test ou non ?

Je pense que j'ai essayé des millions d'autres options, mais maintenant je suis bloqué dessus:

$whiteliste = Get-Content C:\whitelist.txt 
$test = (dotnet list C:\Tasks.Api.csproj package)
$array = @()
$test[3..($test.Length-2)] | foreach {
$array+=$_
}
Foreach ($item in $array) {
Write-host "!!!" $item
$containsWord = $whiteliste | %{$_ -contains $item.Remove(" ")}
if ($containsWord -contains $true) {
Write-Host "There is!"
} else {
Write-Host "There ins't!"
}
}

Merci!


Solution du problème

Sans être fantaisiste, une solution simple serait d'utiliser l' -Matchopérateur pour trouver ces références de packages, car ce sont des noms uniques, et nous pouvons utiliser des RegEx conviviaux :

$whiteliste = (Get-Content -Path "C:\whitelist.txt").Foreach{[regex]::Escape($_.Trim())} -join "|"
$test.Foreach{
if ($_ -match $whiteliste) {
Write-Host -Object "Found: [$($Matches[0])]"
}
}

Edit : sur la base de votre commentaire sur le message de Santi, si vous souhaitez qu'il vous indique s'il n'y a pas de correspondance trouvée, vous pouvez ajouter une clause Begin, Process et End :

$test.ForEach{
Begin { $Matches = $null }
Process {
if ($_ -match $tomatch) {
Write-Host -Object "Found: $($Matches[0])"
}
}
End {
if ($null -eq $Matches) {
"No Match Found:("
}
}
}


  • Tout d'abord, la clause Begin définira la variable automatique de $matchesà $null; de cette façon, il n'interfère pas avec les matchs passés.

  • Ensuite, la clause Process exécutera votre code à ajouter à $matches.

  • Enfin, la clause End vérifiera si $matchesa été rempli et si ce n'est pas le cas, indique que rien n'a été trouvé.

    • Ceci est faisable car -matchremplira la $matchesvariable lorsque quelque chose sera trouvé.

    • Si rien n'est trouvé, la variable ne sera pas renseignée.



Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...