Question Remplacer nom variable

Plus d'informations
il y a 8 ans 7 mois #20574 par LePatriot
Remplacer nom variable a été créé par LePatriot
Bonjour tout le monde,

J'ai besoin de chercher et de remplacer une ligne dans un fichier ps1

[code:1]
$File = 'C:\logiciel.ps1'

$arg1 = '[version]$version = \"4.5\"'
$arg2 = '[version]$version2 = \"5.0\"'


(Get-Content $File) | Foreach-Object {$_ -replace $arg1, $arg2} | Set-Content $File


[/code:1]

Premier problème:
Comment faire pour remplacer un nom de variable par un autre ($version par $version2) ? Je pensais mettre ` devant $, mais la ligne n'est plus trouvé. Si je ne le met pas $version n'apparait pas si je fais afficher mes variable.

2e problème:
Je ne connais pas le numéro de version lors de la recherche. Ici le nombre 4.5. Si j'écris '[version]$version = \"*' , le 4.5 n'est pas remplacé.

J'espère avoir été assez claire.
Merci de votre aide.

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

Plus d'informations
il y a 8 ans 7 mois #20616 par NicolasBdn
Réponse de NicolasBdn sur le sujet Re:Remplacer nom variable
Bonjour,¨

Premier conseil: Utilise un regex.
Ensuite, pour vérifier si ton regex fonctionne, utilise -match.

Voilà ce que j'ai trouvé:

[code:1]$File = \"C:\logiciel.ps1\"

$arg1 = '(\[version\]\$version = )\"\d.\d\"'
$arg2 = '$1\"5.0\"'


(Get-Content $File) | Foreach-Object {$_ -replace $arg1, $arg2}[/code:1]

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

Plus d'informations
il y a 8 ans 7 mois #20632 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Remplacer nom variable
Salut,
une remarque en passant :
NicolasB écrit:

Premier conseil: Utilise un regex.

Ici, elle dépend du respect de la syntaxe d'écriture.
Si on ajoute ou si on supprime un espace la regex échoue en silence, idem si le numéro de version est sur deux digits.

Ceci dit ta solution est correcte pour l'exemple donné.

Mais pour traiter les différentes constructions de nom de variable (cités dans les spécifications de PS v3), à moins de tester toutes les écritures possibles, l'usage de regex est limité, du coup celui de l'AST me semble préférable :
[code:1]
[version] $version='4.01'
[version] ${version} = '4.0'
$s = New-PSSession
Invoke-Command -Sessions $s -ScriptBlock {Write-Host $Using:Version}

[version] $script:version = '2.0'

$i,$version,$k = 10,'1.0',$true
$a = $Version = $c = '5.0'

$Variable:Version=1.0
[version] $Variable:Version='1.0'

$Alias:Version = \"Demo\"

$isOk= $PSVersionTable.psversion -gt '3.0'
${isOk}= $PSVersionTable.psversion -gt '3.0'
$I =9
$I +=1
[/code:1]
Il existe cette fonction , mais elle ne couvre pas tous les cas.
L'utilisation de tokens ne détaille pas l'usage :
[code:1]
$ast. ... .VariablePath

UserPath : script:version
IsGlobal : False
IsLocal : False
IsPrivate : False
IsScript : True
IsUnqualified : False
IsUnscopedVariable : False
IsVariable : True
IsDriveQualified : False
DriveName :
[/code:1]
On peut ainsi cibler plus précisément les noms de variables à modifier.

Un outil de modification de code et pas de chaîne serait le bienvenu :)

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 7 mois #20634 par LePatriot
Réponse de LePatriot sur le sujet Re:Remplacer nom variable
Effectivement, je n'avais pas précisé, mais il peut y avoir plusieurs digits.

Il me reste quelque modification à faire.

Merci de m'avoir orienté B)

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

Plus d'informations
il y a 8 ans 7 mois #20638 par NicolasBdn
Réponse de NicolasBdn sur le sujet Re:Remplacer nom variable
Bonjour Laurent,

Effectivement, je n'est pas pris compte du nombre de digit.

Dans ce cas on pourrait aussi en tenir compte dans le regex:

[code:1]
$arg1 = '(\[version\]\$version = )\"\d{1,}.\d{1,}\"'[/code:1]

Je n'avais pas connaissance de l'AST, je vais de ce pas y jeter un œil!

Merci.

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

Plus d'informations
il y a 8 ans 7 mois #20640 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Remplacer nom variable
NicolasB écrit:

Je n'avais pas connaissance de l'AST, je vais de ce pas y jeter un œil!

Tout compte fait ici l'usage de l'AST complexifie le code si on souhaite couvrir les différents type d'écriture.

Ceci dit je reste prudent sur cette modification automatique de code via une regex, le plus souvent on le fait de 'visu' via un cherche/remplace.

Tutoriels PowerShell

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

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