locked
Décalage de chaine de caractère tableau RRS feed

  • 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.

    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_luc

    La 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
  • on peut poursuivre par mail?

    • Modifié shuters jeudi 2 février 2017 15:08
    jeudi 2 février 2017 14:45
  • 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.

    dimanche 5 février 2017 15:46