Question
commande -match
- heyraud
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 20
- Remerciements reçus 0
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
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 13 ans 9 mois #12047
par Laurent Dardenne
Tutoriels PowerShell
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:
Un exemple :
[code:1]
\"CategoryInfo : ObjectNotFound: (dfs:«»String) [Get-Service], ServiceCommandException\",
\"CategoryInfo : ObjectNotFound: (dfsr:«»String) [Get-Service], ServiceCommandException\",
\"CategoryInfo : ObjectNotFound: (adfs: String) [Get-Service], ServiceCommandException\"|
Foreach {
$_ -match \"\(dfs:\"
}
[/code:1]
Bien qu'en lisant ton extrait de code, je me demande bien si c'est la bonne approche
à 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:
Dans un premier temps, il faut ancrer la regex ou utiliser les opérateur dit paresseux.Mais Comment spécifier que dfs est bon mais pas dfsr
Un exemple :
[code:1]
\"CategoryInfo : ObjectNotFound: (dfs:«»String) [Get-Service], ServiceCommandException\",
\"CategoryInfo : ObjectNotFound: (dfsr:«»String) [Get-Service], ServiceCommandException\",
\"CategoryInfo : ObjectNotFound: (adfs: String) [Get-Service], ServiceCommandException\"|
Foreach {
$_ -match \"\(dfs:\"
}
[/code:1]
Bien qu'en lisant ton extrait de code, je me demande bien si c'est la bonne approche
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
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...
[code:1]$var = \"dNsDnS\"
$var -match \"dns\" [/code:1]
C'est moi qui a rien capté ?
<br><br>Message édité par: benduru, à: 18/06/12 22:34
J'essai de faire une recherche de mot dans une variable contenant le mot \"dns\" peut inporte la casse.
[code:1]$var = \"dNsDnS\"
$var -match \"dns\" [/code:1]
C'est moi qui a rien capté ?
Connexion ou Créer un compte pour participer à la conversation.
- heyraud
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 20
- Remerciements reçus 0
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 = \"fzfezf « dfsr » zfzfz\"
$var -match \"« $test »\" => false quand $test vaut dfs
$var -match \"« $test »\" => 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 \"« $test »\"«»)
{Write-Host \"Le service nommé \"\"$test\"\" n'est pas installé sur la machine \"\"$_\"\" \"}
}
[/code:1]
Merci laurent pour ton idée, effectivement ce serait plus simple que je recherche la chaine \"(dfs:\" dans le message d'erreur.
Sauf que lorsque je mais remplace dans mon code:
[code:1]If ($ListeError -match \"\($test:\")
ou
If ($ListeError -match \"\($test`:\")
[/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
Je voudrais par exemple
$var = \"fzfezf « dfsr » zfzfz\"
$var -match \"« $test »\" => false quand $test vaut dfs
$var -match \"« $test »\" => 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 \"« $test »\"«»)
{Write-Host \"Le service nommé \"\"$test\"\" n'est pas installé sur la machine \"\"$_\"\" \"}
}
[/code:1]
Merci laurent pour ton idée, effectivement ce serait plus simple que je recherche la chaine \"(dfs:\" dans le message d'erreur.
Sauf que lorsque je mais remplace dans mon code:
[code:1]If ($ListeError -match \"\($test:\")
ou
If ($ListeError -match \"\($test`:\")
[/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
Connexion ou Créer un compte pour participer à la conversation.
- SiSMik
- Hors Ligne
- Membre platinium
-
Réduire
Plus d'informations
- Messages : 492
- Remerciements reçus 0
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
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' ) { \"OK\" }
else { \"FALSE\" }
}
[/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
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
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' ) { \"OK\" }
else { \"FALSE\" }
}
[/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.
- heyraud
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 20
- Remerciements reçus 0
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' ) { \"OK\" }
else { \"FALSE\" }
}[/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 <<<< -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 ».
+ $ListeError = get-service <<<< -name $ListeServices -computername $_ 2>&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 \"^$service\z\" ) { \"OK\" }
else { \"FALSE\" }
}[/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 \"\($service`:\" ) { \"OK\" }
else { \"FALSE\" }
}[/code:1]
Normalement avec ça cela devrait fonctionner mais en fait non:
[code:1]Foreach ( $service in $listeServices ) {
if ( $listeerror -match \"\($service`:\" ) { \"OK\" }
else { \"FALSE\" }
}
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) { \"OK\" }
else { \"FALSE\" }
}
FALSE
OK
OK
OK
OK
FALSE
OK
FALSE
FALSE
[/code:1]<br><br>Message édité par: lsda26, à: 19/06/12 12:37
[code:1]$liste = @('dns','dfs','dfsr','adfse')
Foreach ( $service in $liste ) {
if ( $service -match '^dfs\z' ) { \"OK\" }
else { \"FALSE\" }
}[/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 <<<< -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 ».
+ $ListeError = get-service <<<< -name $ListeServices -computername $_ 2>&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 \"^$service\z\" ) { \"OK\" }
else { \"FALSE\" }
}[/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 \"\($service`:\" ) { \"OK\" }
else { \"FALSE\" }
}[/code:1]
Normalement avec ça cela devrait fonctionner mais en fait non:
[code:1]Foreach ( $service in $listeServices ) {
if ( $listeerror -match \"\($service`:\" ) { \"OK\" }
else { \"FALSE\" }
}
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) { \"OK\" }
else { \"FALSE\" }
}
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- commande -match