Question
Remplacer nom variable
- LePatriot
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 31
- Remerciements reçus 0
il y a 9 ans 3 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.
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.
- NicolasBdn
- Hors Ligne
- Membre senior
il y a 9 ans 3 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]
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 2 mois #20632
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Remplacer nom variable
Salut,
une remarque en passant :
NicolasB écrit:
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
une remarque en passant :
NicolasB écrit:
Ici, elle dépend du respect de la syntaxe d'écriture.Premier conseil: Utilise un regex.
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.
- LePatriot
- Auteur du sujet
- Hors Ligne
- Membre junior
Réduire
Plus d'informations
- Messages : 31
- Remerciements reçus 0
il y a 9 ans 2 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é
Il me reste quelque modification à faire.
Merci de m'avoir orienté
Connexion ou Créer un compte pour participer à la conversation.
- NicolasBdn
- Hors Ligne
- Membre senior
il y a 9 ans 2 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.
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 2 mois #20640
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Remplacer nom variable
NicolasB écrit:
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.
Tout compte fait ici l'usage de l'AST complexifie le code si on souhaite couvrir les différents type d'écriture.Je n'avais pas connaissance de l'AST, je vais de ce pas y jeter un œil!
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.113 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Discussions générales
- Remplacer nom variable