Question commande -match

Plus d'informations
il y a 13 ans 9 mois #12045 par heyraud
commande -match a été créé par heyraud
Bonjour,
J'essai de faire une recherche de mot dans une variable contenant le mot \"dns\" peut inporte la casse.


Contenu de la variable $ListeError:
[code:1]Get-Service : Impossible de trouver un service assorti du nom « dfs ».
Au niveau de D:\Dropbox\ASUR\windows\Powershell\Test des service sur des AD.ps1 : 27 Caractère : 34
+ $ListeError = get-service <<<< -name $ListeServices -computername $_ 2>&1
+ CategoryInfo : ObjectNotFound: (dfs:«»String) [Get-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand

Get-Service : Impossible de trouver un service assorti du nom « dfsr ».
Au niveau de D:\Dropbox\ASUR\windows\Powershell\Test des service sur des AD.ps1 : 27 Caractère : 34
+ $ListeError = get-service <<<< -name $ListeServices -computername $_ 2>&1
+ CategoryInfo : ObjectNotFound: (dfsr:«»String) [Get-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand[/code:1]

Avec un traitement par un foreach, la commande match me renvoi vrai aussi bien pour \"dfs\" que pour \"dfsr\" ce qui est normal

Mais Comment spécifier que dfs est bon mais pas dfsr
j'essai de spécifier qu'il faut la syntaxe \"« $test ».\" mais la commande -match ne fonctionne alors plus! Du genre:
[code:1]$ListeServices=dfs,dfsr,dns
foreach ($test in $ListeServices)
{
$regex=\"« $test ».\"
If ($ListeError -match $regex) { Write-Host \"Le service du nom de \"\"$test\"\" n'est pas installé sur la machine \"\"$_\"\" \" }
}[/code:1]
Comme ça il ne prendrais que \"dfs\" et pas \"dfsr\"


Merci pour votre aide!<br><br>Message édité par: lsda26, à: 18/06/12 18:43

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12047 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:commande -match
Salut,
à l'avenir si peux éviter le gras, qui comme chacun sait n'est pas très bon pour la santé, tes postes seront plus digestes.
lsda26 écrit:

Mais Comment spécifier que dfs est bon mais pas dfsr

Dans un premier temps, il faut ancrer la regex ou utiliser les opérateur dit paresseux.
Un exemple :
[code:1]
\&quot;CategoryInfo : ObjectNotFound: (dfs:«»String) [Get-Service], ServiceCommandException\&quot;,
\&quot;CategoryInfo : ObjectNotFound: (dfsr:«»String) [Get-Service], ServiceCommandException\&quot;,
\&quot;CategoryInfo : ObjectNotFound: (adfs: String) [Get-Service], ServiceCommandException\&quot;|
Foreach {
$_ -match \&quot;\(dfs:\&quot;
}
[/code:1]
Bien qu'en lisant ton extrait de code, je me demande bien si c'est la bonne approche :S

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12048 par SiSMik
Réponse de SiSMik sur le sujet Re:commande -match
Bizarre, car si je comprends bien ton problème c'est tout bête...

J'essai de faire une recherche de mot dans une variable contenant le mot \&quot;dns\&quot; peut inporte la casse.


[code:1]$var = \&quot;dNsDnS\&quot;
$var -match \&quot;dns\&quot; [/code:1]

C'est moi qui a rien capté ? :blink:<br><br>Message édité par: benduru, à: 18/06/12 22:34

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12051 par heyraud
Réponse de heyraud sur le sujet Re:commande -match
C'est justement pas ce que je cherche. Je voudrait être plus restrictif dans la recherche avec -match.
Je voudrais par exemple
$var = \&quot;fzfezf « dfsr » zfzfz\&quot;
$var -match \&quot;« $test »\&quot; =&gt; false quand $test vaut dfs
$var -match \&quot;« $test »\&quot; =&gt; true quand $test vaut dfsr

Sachant que $test prend tour à tour la valeur dfs, dfsr, dns,... afin de savoir si ces service se trouvent dans les erreurs ($listeError).

Mais je pense avoir un soucis dans l'ecriture de l'expression régulière car lorsque j'essai d'ecrire le code ci-dessous je n'ai plus rien en sortie!:
[code:1]foreach ($test in $ListeServices)
{If ($ListeError -match \&quot;« $test »\&quot;«»)
{Write-Host \&quot;Le service nommé \&quot;\&quot;$test\&quot;\&quot; n'est pas installé sur la machine \&quot;\&quot;$_\&quot;\&quot; \&quot;}
}
[/code:1]

Merci laurent pour ton idée, effectivement ce serait plus simple que je recherche la chaine \&quot;(dfs:\&quot; dans le message d'erreur.
Sauf que lorsque je mais remplace dans mon code:
[code:1]If ($ListeError -match \&quot;\($test:\&quot;)
ou
If ($ListeError -match \&quot;\($test`:\&quot;)
[/code:1]
Je n'ai plus rien en sortie du if (comme si il retournait faux tout le temps) A moin que je n'ai une autre erreur de codage ailleurs.

Je suis bien conscient que ce n'est surement pas la meilleur approche pour traiter les erreurs mais je ne connais pas d'autre moyens actuellement. Mais je suis preneur pour toute autre solution ;)<br><br>Message édité par: lsda26, à: 19/06/12 09:31

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12055 par SiSMik
Réponse de SiSMik sur le sujet Re:commande -match
Ok, donc j'avais rien compris au premier post...
J'ai beaucoup de mal avec les expressions régulières moi aussi..

Je pense que tu utilises mal l'opérateur -match, tu ne dois pas appliquer l'expression régulière sur ton service à tester, mais tu dois le tester avec l'expression régulçère.. J'espère avoir été clair :silly:

Donc déjà je verrais plus un truc de ce style:

[code:1]
$liste = @('dns','dfs','dfsr','adfse')
Foreach ( $service in $liste ) {
if ( $service -match '^dfs\z' ) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}
[/code:1]

Explications du regex:
^ signifie début de string, donc dfs doit être le début de la valeur que l'on teste
\z signifie fin de string, donc dfs doit aussi être la fin du string qu'on teste.

Je sais pas si c'est très bien fait, mais ça fonctionne

[code:1]FALSE
OK
FALSE
FALSE
[/code:1]

ça donne ça chez moi<br><br>Message édité par: benduru, à: 19/06/12 10:09

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 9 mois #12062 par heyraud
Réponse de heyraud sur le sujet Re:commande -match
le bout de code que tu propose ne répond pas encore à mes besoins même si j'aprends des choses :)
[code:1]$liste = @('dns','dfs','dfsr','adfse')
Foreach ( $service in $liste ) {
if ( $service -match '^dfs\z' ) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}[/code:1]

car j'ai une variable $listeerror contenant par exemple le texte suivant (chaque paragraphe est crée quand un service n'est pas installé sur la machine):
Get-Service :
[code:1]Impossible de trouver un service assorti du nom « dfs ».
+ $ListeError = get-service &lt;&lt;&lt;&lt; -name $ListeServices -computername $_ 2&gt;&amp;1
+ CategoryInfo : ObjectNotFound: (dfs:«»String) [Get-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand

Get-Service : Impossible de trouver un service assorti du nom « dfsr ».
+ $ListeError = get-service &lt;&lt;&lt;&lt; -name $ListeServices -computername $_ 2&gt;&amp;1
+ CategoryInfo : ObjectNotFound: (dfsr:«»String) [Get-Service], ServiceCommandException
+ FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.GetServiceCommand[/code:1]

donc ma solution actuelle est de rechercher tous les nom de service contenus dans ma variable $listeservices dans la variable $listeerror.
Pour cela j'utilise un foreeach afin de passer en revu tous les services dans $listeservices:

Ce qui en gardant ta syntax donnerai plutôt:
[code:1]
$liste = @('dns','dfs','dfsr','adfse')
Foreach ( $service in $listeServices ) {
if ( $listeerror -match \&quot;^$service\z\&quot; ) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}[/code:1]

D'ou la proposition de laurent de chercher le text (dns: ou (dfs: dans le texte contenu dans $listerror.

Sauf que en utilisant une variable à la place du nom de service et en voulant rechercher par exemple (:dns (dfs: (dfsr: je n'arriva pas à ecrire la bonne syntaxe:
[code:1]Foreach ( $service in $listeServices ) {
if ( $listeerror -match \&quot;\($service`:\&quot; ) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}[/code:1]
Normalement avec ça cela devrait fonctionner mais en fait non:
[code:1]Foreach ( $service in $listeServices ) {
if ( $listeerror -match \&quot;\($service`:\&quot; ) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE
FALSE[/code:1]

Alors que le code que j'avais au début semble fonctionner mais ne fait pas le distingo entre dfs et dfsr:
[code:1]Foreach ( $service in $listeServices ) {
if ( $listeerror -match $service) { \&quot;OK\&quot; }
else { \&quot;FALSE\&quot; }
}
FALSE
OK
OK
OK
OK
FALSE
OK
FALSE
FALSE
[/code:1]<br><br>Message édité par: lsda26, à: 19/06/12 12:37

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.055 secondes
Propulsé par Kunena