Meilleur auteur de réponses
Décalage de chaine de caractère tableau

Question
-
Bonjour a vous ,
Je suis en train de faire un script :
J'ai un tableau qui retourne une chaine de caractère
exemple de la chaine de caractère qui est retournée :
fabrice, luc, jean, henri, paul, jacques, claude
je m'intérésse principalement à : luc, jean
j'aimerais que jean soit placer avant luc
il y a 4 cas :
1- luc et jean sont présent dans le tableau (on vérifie si luc est avant jean alors on inverse)
2- luc est seul il faut rajouter jean juste avant sans toucher les autres nom
3- jean est seul il faut rajouter jean juste après sans toucher les autres nom
4- ni jean ni luc n'est présent dans le tableau il faut les rajouter
pour le cas 1 j'arrive à faire mon inversion :
#If luc and jean exists
if ($pos_luc -ge 0 -and $pos_jean -ge 0)
{
#If luc is placed before jean, reverse
if ($pos_luc -lt $pos_jean)
{
$dns[$pos_luc] = $var_jean;
$dns[$pos_jean] = $var_luc;
}
#If jean is place before luc, do not touch
else
}
Par contre pour les cas ou l'un est présent et l'autre non
voici ce que je fais :
#If jean exist and luc not exists
if ($pos_luc -eq -1 -and $pos_jean -ge 0)
{
$dns[$pos_jean] = $var_jean;
$dns[$pos_luc] = $var_luc;
}
else
{
WriteHost "do nothing"
}
Qu'en pensez vous ? ne vous faché pas je débute dans le scripting si vous avez des conseils je suis preneur
j'ai pu voir également qu'il été mieux d'utiliser la manipulations de chaine de caractère.
merci pour vos retours
- Modifié shuters jeudi 2 février 2017 09:00
mercredi 1 février 2017 15:35
Réponses
-
Là, je ne vois plus très bien ou je n'ai pas encore compris la finalité du script.
Ce que j'ai compris de ce que tu veux faire:
- Récupérer une valeur du registre
- La traiter pour que dans celle-ci, il y aie toujours "Jean" et "Luc", dans cet ordre là, sans tenir compte de leur positions.
- Réinjecter la valeur ainsi traité dans le registre.
Si c'est cela, ni plus ni moins, que tu veux faire, alors, ton script complet sera:
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq $NewDns = "jean", "Luc" $dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_} $NewDnsSTR = $NewDns -join ", " Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList -Value $NewDnsSTR
Maintenant, si tu veux des actions supplémentaires, comme du log (savoir si Luc ou Jean étaient présent, et dans quel ordre, ...) c'est des ajouts à ce script que tu dois faire.
Par exemple, si les actions du script doivent être:
- Récupérer une valeur du registre.
- L'analyser pour savoir si Jean s'y trouve?
- L'analyser pour savoir si Luc s'y trouve?
- Si Jean et Lus s'y trouve, est-ce qu'ils sont dans le bon ordre?
- Si Jean et Luc sont dans le bon ordre, est-ce qu'il sont l'un derrière l'autre?
- Sauvegarder le log des quatre point précédents
- La traiter pour que dans celle-ci, il y aie toujours "Jean" et "Luc", dans cet ordre là, sans tenir compte de leur positions.
- Réinjecter la valeur ainsi traité dans le registre.
Cela ressemblera à :
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq $pos_luc = $dns.IndexOf("Luc") $pos_jean = $dns.IndexOf("Jean") if ($pos_jean -ge 0) {$JeanExist = $true} else {$JeanExist = $false} if ($pos_luc -ge 0) {$LucExist = $true} else {$LucExist = $false} if ($JeanExist -and $LucExist) { if ($pos_jean -lt $pos_luc) { $JLOrderExact = $True if (($pos_luc - $pos_jean) -eq 1) { $JeanJustBeforeLuc = $True } else { $JeanJustBeforeLuc = $false } } else { $JLOrderExact = $False $JeanJustBeforeLuc = "N/A" } } else { $JLOrderExact = "N/A" $JeanJustBeforeLuc = "N/A" } Out-File -filepath ".\Log.txt" -InputObject ` "Jean présent: $JeanExist` Luc présent: $LucExist` Ordre exact: $JLOrderExact` Jean avant Luc: $JeanJustBeforeLuc" $NewDns = "jean", "Luc" $dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_} $NewDnsSTR = $NewDns -join ", " Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList -Value $NewDnsSTR
Autre chose, dans ton code, tu déclare la variable:
$var_two = "jean,luc";
Ce qui fait que $Var_Two est un string, d'un seul tenant, et non deux éléments d'un array.
Autre chose, -Match -NotMatch - Replace (et bien d'autre) utilise une expression régulière.
Et dans les expressions régulières, le point correspond à n'importe quel caractère, pour que ce soit un point qui match, il faut l’échapper avec le backslash.B.
- Marqué comme réponse Teodora Sharkova lundi 27 février 2017 16:43
dimanche 5 février 2017 15:46
Toutes les réponses
-
Un peu plus d'info stp.
Comment obtiens-tu les variables suivantes:
$pos_luc, $pos_jean, $dns, $var_jean, $var_lucLa chaine fabrice, luc, jean, henri, paul, jacques, claude
est-ce une 'string' "fabrice, luc, jean, henri, paul, jacques, claude"
Ou un 'array' "fabrice", "luc", "jean", "henri", "paul", "jacques", "claude"B.
mercredi 1 février 2017 21:09 -
Bonjour et merci pour votre réponse
Je tape dans une clé de registre qui me sort un tableau
voici ma déclaration de variable :
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split ","
$dns = $dns | select -uniq
$pos_luc = -1; $var_luc = "luc";
$pos_jean = -1; $var_jean = "jean";je ne précise pas si c'est un string ou un aray, mais c'est plutôt un aray
Voici par exemple ce que je dois avoir :Si j'ai que luc :
"fabrice(n0)", "luc (n1)", "henri (n2)", "paul (n3)", "jacques (n4)", "claude (n5)"
ce que je dois avoir :
"fabrice (n0)", " jean(n1)", "luc(n2)", "henri (n3)", "paul (n4)", "jacques (n5)", "claude (n6)"
Si j'ai que jean :
"fabrice(n0)", "jean (n1)", "henri (n2)", "paul (n3)", "jacques (n4)", "claude (n5)"
ce que je dois avoir :
"fabrice(n0)", " jean(n1)", "luc(n2)", "henri (n3)", "paul (n4)", "jacques (n5)", "claude (n6)"
Si je n'ai ni jean ni luc :
"fabrice(n0)", "paul (n1)", "jacques (n2)", "claude (n3)"
Peut importe ou il sont placer tant que jean est avant luc
J'espere que j'ai été suffisament clair merci pour vos réponses
Résumé de mon script :
Variables :
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split ","
$dns = $dns | select -uniq
$pos_luc = -1; $var_luc = "luc";
$pos_jean = -1; $var_jean = "jean";
#Presence of jean and luc?
for($cle = 0; $cle -lt $nb_items; $cle++)
{
if ($dns[$cle] -eq $var_luc)
{
$pos_luc = $cle;
}
if ($dns[$cle] -eq $var_jean)
{
$pos_jean = $cle;
}
}#If luc and jean exists
if ($pos_luc -ge 0 -and $pos_jean -ge 0)
{
#If luc is placed before jean, reverse
if ($pos_luc -lt $pos_jean)
{
$dns[$pos_luc] = $var_jean;
$dns[$pos_jean] = $var_luc;
}
#If jean is place before luc, do not touch
else{
Write-Host "dont touch"
}
}
- Modifié shuters jeudi 2 février 2017 09:07
jeudi 2 février 2017 08:16 -
Ok, c'est clair maintenant
Je regarde ce soir
B.
jeudi 2 février 2017 14:15 -
-
Non, cela doit rester public
B.
jeudi 2 février 2017 14:48 -
Puisque que la position de "jean" et luc" n'a pas d'importance, c'est assez simple.
Voici:
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq $NewDns = "jean", "Luc" $dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_}
En résumé:
- On créé une nouvelle variable ($NewDns) avec Jean et Luc dans le bon ordre.
- On ajoute à cette variable la variable $dns sans jean et sans luc
Le résultat est une variable $NewDNS avec Jean et Luc dans l'ordre souhaité, et ce, quel que soit le cas.
Et si tu veux ajouter Jean et luc à la fin, c'est comme ceci:
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq
$NewDns = @()
$dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_}
$NewDns += "jean", "Luc"Comme cela, tu auras toujours Jean avant Luc dans ta variable.
Maintenant, si tu veux regrouper $NewDns en un string, fais comme ceci:
$NewDnsSTR = $NewDns -join ", "
Tu pourras ainsi repousser $NewDnsSTR dans le registre.
B.
jeudi 2 février 2017 22:04 -
effectivement j'y avais vraiment pas penser c'est beaucoup plus simple !
ce que j'ai fais j'ai crée ma variable dans le bonne ordre :
$var_two = "jean,luc"; et voici ce que je fais : #if luc not exist and jean exists if ($pos_luc -eq -1 -and $pos_jean -ge 0) { $dns[$pos_jean] = $var_deux; } else { LogWrite "do nothing" } #if luc exist and jean not exists if ($pos_luc -ge 0 -and $pos_jean -eq -1) { $dns[$pos_luc] = $var_two; } else { LogWrite "do nothing" }
Ca fonctionne super,
par contre voici ce que je fais quand les deux ne sont pas la :
###(0/2) S'il n'y a aucun suffixe DNS sur les deux rechercher
### Alors on rajoute celui manquant
#if DSK.FR not exist and DSK.EUR not exist
if ($pos_fr -eq -1 -and $pos_eur -eq -1)
{
LogWrite "DSK.FR not exist and DSK.EUR not exist";
$dns | where {$_ -notmatch "dsk.eur.msd.world.socgen|dsk.fr.world.socgen"} | foreach {$var_two +=$_}
}
else
{
LogWrite "do nothing"
}Par contre voici ce que j'utilise pour regrouper :
$newDns = $dns -Join ",";
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList -Value $newdns
Ca m'écrase mon dernier suffixes DNS et ça ne rajoute pas les deux manquants...
Comment puis - je implémenter ta boucle where dans mon script ?
Merci beacoup pour tes éclaircicements
- Modifié shuters vendredi 3 février 2017 09:06
vendredi 3 février 2017 08:41 -
Là, je ne vois plus très bien ou je n'ai pas encore compris la finalité du script.
Ce que j'ai compris de ce que tu veux faire:
- Récupérer une valeur du registre
- La traiter pour que dans celle-ci, il y aie toujours "Jean" et "Luc", dans cet ordre là, sans tenir compte de leur positions.
- Réinjecter la valeur ainsi traité dans le registre.
Si c'est cela, ni plus ni moins, que tu veux faire, alors, ton script complet sera:
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq $NewDns = "jean", "Luc" $dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_} $NewDnsSTR = $NewDns -join ", " Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList -Value $NewDnsSTR
Maintenant, si tu veux des actions supplémentaires, comme du log (savoir si Luc ou Jean étaient présent, et dans quel ordre, ...) c'est des ajouts à ce script que tu dois faire.
Par exemple, si les actions du script doivent être:
- Récupérer une valeur du registre.
- L'analyser pour savoir si Jean s'y trouve?
- L'analyser pour savoir si Luc s'y trouve?
- Si Jean et Lus s'y trouve, est-ce qu'ils sont dans le bon ordre?
- Si Jean et Luc sont dans le bon ordre, est-ce qu'il sont l'un derrière l'autre?
- Sauvegarder le log des quatre point précédents
- La traiter pour que dans celle-ci, il y aie toujours "Jean" et "Luc", dans cet ordre là, sans tenir compte de leur positions.
- Réinjecter la valeur ainsi traité dans le registre.
Cela ressemblera à :
$dns = ((Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList).SearchList) -split "," $dns = $dns | select -uniq $pos_luc = $dns.IndexOf("Luc") $pos_jean = $dns.IndexOf("Jean") if ($pos_jean -ge 0) {$JeanExist = $true} else {$JeanExist = $false} if ($pos_luc -ge 0) {$LucExist = $true} else {$LucExist = $false} if ($JeanExist -and $LucExist) { if ($pos_jean -lt $pos_luc) { $JLOrderExact = $True if (($pos_luc - $pos_jean) -eq 1) { $JeanJustBeforeLuc = $True } else { $JeanJustBeforeLuc = $false } } else { $JLOrderExact = $False $JeanJustBeforeLuc = "N/A" } } else { $JLOrderExact = "N/A" $JeanJustBeforeLuc = "N/A" } Out-File -filepath ".\Log.txt" -InputObject ` "Jean présent: $JeanExist` Luc présent: $LucExist` Ordre exact: $JLOrderExact` Jean avant Luc: $JeanJustBeforeLuc" $NewDns = "jean", "Luc" $dns | where {$_ -notmatch "jean|luc"} | foreach {$NewDns += $_} $NewDnsSTR = $NewDns -join ", " Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\services\Tcpip\Parameters' -Name SearchList -Value $NewDnsSTR
Autre chose, dans ton code, tu déclare la variable:
$var_two = "jean,luc";
Ce qui fait que $Var_Two est un string, d'un seul tenant, et non deux éléments d'un array.
Autre chose, -Match -NotMatch - Replace (et bien d'autre) utilise une expression régulière.
Et dans les expressions régulières, le point correspond à n'importe quel caractère, pour que ce soit un point qui match, il faut l’échapper avec le backslash.B.
- Marqué comme réponse Teodora Sharkova lundi 27 février 2017 16:43
dimanche 5 février 2017 15:46