none
Lecture de fichier et attribution de variables RRS feed

  • Question

  • Bonjour,

    Je cherche à récupérer le contenu d'un fichier texte généré automatiquement, et à créer des variables en fonction du résultat. Je m'explique :

    J'utilise un logiciel qui me permet de créer un log d'un ordinateur, qui sera créé sous cette forme :

    nom=portable
    option1=oui
    option2=oui
    option3=non
    option4=oui
    option5=non

    La partie "nom" peut changer entre "portable" ou "fixe", et je souhaite créer une variable différente pour chaque ligne en-dessous, mais je ne sais pas comment procéder. Le but est de dire que si l'option existe, on attribue une valeur, sinon, si l'option n'existe pas, on laisse un champ vide.

    J'ai testé ce code, mais cela ne fonctionne pas :

    $Content = Get-Content chemin\log.ini Foreach ( $line in $Content ) { if ($line -match "nom=portable") { if ($line -match "option1") { $options1 = 'option1=oui' } else { $option1 = '' } }
    else if ($line -match "nom=fixe") {
    if ($line -match "option1") {
    $option1 = 'option1=oui'
    } else {
    $option1 = ''
    }
    } }


    Une idée de comment je pourrai procéder ?

    Cordialement,

    Benjamin


    • Modifié benj.wlm mardi 29 mars 2016 09:25
    mardi 29 mars 2016 09:22

Toutes les réponses

  • Salut,

    tu peux lire la seconde ligne avec  $foreach.MoveNext(), mais dans ton cas je te conseille de transformer le contenu de ton fichier ini en un objet, puis de modifier l'objet obtenu et enfin de transformer l'objet en un fichier ini.

    Si le nombre de ligne est fixe et le contenu structuré tu peux aussi lire ton fichier via un tableau indexé :$Content[1]  ...

    Autre approche, si seul le script accède à ton fichier de paramétrage, l'usage d'un fichier csv peut simplifier l'écriture du code et sa relecture.


    Beatus, qui prodest, quibus potest.

    mardi 29 mars 2016 12:39
    Modérateur
  • Je pense avoir résolu mon problème comme ceci :

    $Content = Get-Content chemin\log.ini $sysname = Get-Content chemin\log.ini|Select-String -Pattern "sysname" Foreach ( $line in $Content ) { if ($sysname -like "*portable*") { Foreach ($line in $Content) { if ($line -like 'option1*') { $option1 = "option1=oui" }
    if ($line -like 'option2*') { $option2 = "option2=oui"}
    }
    } elseif ($sysname -like "*fixe*") {
    Foreach ($line in $Content) {
    if ($line -like 'option1*') { $option1 = "option1=non" }
    if ($line -like 'option2*') { $option2 = "option2=non" }
    }
    }
    }



    mardi 29 mars 2016 12:43
  • voici un script commenté:

    $Log = get-content -path chemin\Log.ini
    
    foreach ($Line in $Log) {
    	# definition d'une variable $Expression qui contient la ligne avec ajout $ au début et un guillemet à la fin
    	$Expression = "$" + $line + """"
    	# Ajout d'un guillemet à droite du signe égal
    	$Expression = $Expression -replace "=", '="'
    	# exécuton de $expression, qui est maintenant un expression powershell valide.
    	invoke-expression -Command $Expression
    	# Expression régulière pour matcher le mot avant le signe égal
    	$Line -match "(?m:^)[\w ]+?(?==)" | out-null
    	# Assignation de la valeurs du match précédent à la variable $VariableName
    	$VariableName = $Matches[0]
    	# Ajout d'une description à cette nouvelle variable, pour nous permettre de la retrouver ensuite
    	set-variable -name $VariableName -description "MesVariables"
    	}
    
    # Listage de mes variables
    $MesVariables = Get-Variable | where {$_.description -eq "MesVariables"}
    
    # Affichage des variable créées
    write-host "Liste de mes variables" -foregroundcolor Green
    $MesVariables
    

    Voila....


    mercredi 30 mars 2016 20:51
  • Bonjour Bawilanemo,

    Ton script est vraiment très intéressant.
    Est-il possible cependant d'ignorer certaines lignes ?

    Comme je l'ai dit au début, le fichier log est généré automatiquement par un logiciel, et certaines lignes sont créées en commençant par les caractères "[" ou ";".

    Cela génère donc des erreurs lors de l'exécution de ton script, et je n'ai pas besoin de ces lignes, j'imagine qu'on peut les ignorer via les expressions régulières ?

    De plus, lorsque je fais un "echo $option1", il m'affiche bien le résultat "oui", mais existe-t-il une solution pour transformer ce résultat en "--option1=oui" ?

    Cordialement,

    Benjamin

    jeudi 31 mars 2016 08:24
  • Voici, avec quelque contrôles supplémentaires avant traitement.

    $ErrorActionPreference = "Stop"
    $Log = get-content -path .\Log.ini
    
    foreach ($Line in $Log) {
    	#exclusion de ligne selon le premier caractère.
    	if (($line -Replace '[ \t]','').startswith("[") -or ($line -Replace '[ \t]','').startswith(";")) {continue}
    	#Exclusion des ligne de faisant 2 caractères ou moins
    	if ($Line.length -le 2) {continue}
    	#Exclusion des lignes qui n'ont pas de signe égal
    	if (!($Line -match "=")) {continue}
    	# definition d'une variable $Expression qui contient la ligne avec ajout $ au début et un guillemet à la fin
    	$Expression = "$" + $line + """"
    	# Ajout d'un guillemet à droite du signe égal
    	$Expression = $Expression -replace "=", '="'
    	# exécuton de $expression, qui est maintenant un expression powershell valide.
    	invoke-expression -Command $Expression
    	# Expression régulière pour matcher le mot avant le signe égal
    	$Line -match "(?m:^)[\w ]+?(?==)" | out-null
    	# Assignation de la valeurs du match précédent à la variable $VariableName
    	$VariableName = $Matches[0]
    	# Ajout d'une description à cette nouvelle variable, pour nous permettre de la retrouver ensuite
    	set-variable -name $VariableName -description "MesVariables"
    	}
    
    # Listage de mes variables
    $MesVariables = Get-Variable | where {$_.description -eq "MesVariables"}
    
    # Affichage des variable créées
    write-host "Liste de mes variables" -foregroundcolor Green
    foreach ($Var in $MesVariables) {
    	write-host "$($Var.name)=$($VAr.value)"
    	}
    
    B.


    • Proposé comme réponse Bawilanemo lundi 4 avril 2016 18:22
    jeudi 31 mars 2016 09:18
  • Attention à l'usage du cmdlet Invoke-Expression sur des données externes au script.

    Je peux modifier une ligne du fichier comme ceci :

    option2=oui";Remove-item C:\*.* -whatif;"


    Beatus, qui prodest, quibus potest.

    jeudi 31 mars 2016 09:36
    Modérateur
  • Attention à l'usage du cmdlet Invoke-Expression sur des données externes au script.

    Je peux modifier une ligne du fichier comme ceci :

    option2=oui";Remove-item C:\*.* -whatif;"


    Beatus, qui prodest, quibus potest.

    Exact, la source qui alimentera le script powershell devra être sûr.

    On peut aussi exclure toute ligne qui contien un point-virgule, à voir avec l'auteur de la demande.

    jeudi 31 mars 2016 09:51
  • Ceci est préférable, à adapter selon ton code autour des regex  :

    $ExecutionContext.SessionState.PSVariable.Set('SansIEX','C plus mieux')

    Il faut juste faire attention au contexte ciblé si on place ce code dans un module...


    Beatus, qui prodest, quibus potest.

    jeudi 31 mars 2016 09:55
    Modérateur