Question
[Résolu]la fonction -replace
- Corentin
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 29
- Remerciements reçus 0
il y a 7 ans 11 mois #25513
par Corentin
Réponse de Corentin sur le sujet Re:la fonction -replace
Le problème du replace est résolu, j'ai donc pu insérer cette fonction dans programme principal, le but de celui ci étant :
- récupérer des données dans un fichier csv,
- en fonction d'un fichier modèle remplacer donc les données comme vu au dessus
- pour pouvoir créer en fin de programme un fichier par école.
Pour cela j'ai essayer une boucle do / until
Ce programme fonctionne en soit mais ne me sort qu'un seul fichier, celui du premier de la liste de mon csv.
J'aimerais donc trouver une solution pour que une fois le programme lancé je n'ai pas qu'un seul fichier de créer mais un par école.
J'espère que c'est clair car c'est un peu compliqué

Mon code :
[code:1]$MonCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
import-csv -Path $MonCsv
do{
foreach ($Ligne in $MonCsv){
$Ligne = get-content -Path $MonCsv | Select-Object -Index 1
$ligne_splitted = $Ligne.split(\",\")
$NOM_ECOLE = $ligne_splitted[0]
$ADDR_FW_LAN = $ligne_splitted[1]
$ADDR_POOL_DHCP_LAN = $ligne_splitted[2]
$ADDR_FW_WAN = $ligne_splitted[3]
$ADDR_MASK_WAN = $ligne_splitted[4]
$ADDR_GW_WAN = $ligne_splitted[5]
$MAC_FW = $ligne_splitted[6]
$content = Get-Content \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\" | foreach { $_ -replace \"<NOM_ECOLE>\",$NOM_ECOLE -replace \"<ADDR_FW_LAN>\", $ADDR_FW_LAN -replace \"<ADDR_POOL_DHCP_LAN>\", $ADDR_POOL_DHCP_LAN -replace \"<ADDR_FW_WAN>\", $ADDR_FW_WAN -replace \"<ADDR_MASK_WAN>\", $ADDR_MASK_WAN -replace \"<ADDR_GW_WAN>\", $ADDR_GW_WAN -replace \"<MAC_FW>\", $MAC_FW }
Set-Content -Path \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.$MAC_FW.modif.clish\" -Value $content
}
} until ($Ligne -ne $null)
[/code:1]<br><br>Message édité par: Corentin, à: 5/06/18 14:43
- récupérer des données dans un fichier csv,
- en fonction d'un fichier modèle remplacer donc les données comme vu au dessus
- pour pouvoir créer en fin de programme un fichier par école.
Pour cela j'ai essayer une boucle do / until
Ce programme fonctionne en soit mais ne me sort qu'un seul fichier, celui du premier de la liste de mon csv.
J'aimerais donc trouver une solution pour que une fois le programme lancé je n'ai pas qu'un seul fichier de créer mais un par école.
J'espère que c'est clair car c'est un peu compliqué
Mon code :
[code:1]$MonCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
import-csv -Path $MonCsv
do{
foreach ($Ligne in $MonCsv){
$Ligne = get-content -Path $MonCsv | Select-Object -Index 1
$ligne_splitted = $Ligne.split(\",\")
$NOM_ECOLE = $ligne_splitted[0]
$ADDR_FW_LAN = $ligne_splitted[1]
$ADDR_POOL_DHCP_LAN = $ligne_splitted[2]
$ADDR_FW_WAN = $ligne_splitted[3]
$ADDR_MASK_WAN = $ligne_splitted[4]
$ADDR_GW_WAN = $ligne_splitted[5]
$MAC_FW = $ligne_splitted[6]
$content = Get-Content \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\" | foreach { $_ -replace \"<NOM_ECOLE>\",$NOM_ECOLE -replace \"<ADDR_FW_LAN>\", $ADDR_FW_LAN -replace \"<ADDR_POOL_DHCP_LAN>\", $ADDR_POOL_DHCP_LAN -replace \"<ADDR_FW_WAN>\", $ADDR_FW_WAN -replace \"<ADDR_MASK_WAN>\", $ADDR_MASK_WAN -replace \"<ADDR_GW_WAN>\", $ADDR_GW_WAN -replace \"<MAC_FW>\", $MAC_FW }
Set-Content -Path \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.$MAC_FW.modif.clish\" -Value $content
}
} until ($Ligne -ne $null)
[/code:1]<br><br>Message édité par: Corentin, à: 5/06/18 14:43
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 7 ans 11 mois #25518
par Arnaud Petitjean
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Re:la fonction -replace
Bonjour !
Vu ton code Corentin, ton fichier CSV ne doit pas être au bon format.
Pourrais-tu nous poster un extrait de ton fichier avec la ligne d'entête ?
Merci.
Arnaud
Vu ton code Corentin, ton fichier CSV ne doit pas être au bon format.
Pourrais-tu nous poster un extrait de ton fichier avec la ligne d'entête ?
Merci.
Arnaud
MVP PowerShell et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 7 ans 11 mois #25520
par Philippe
Réponse de Philippe sur le sujet Re:la fonction -replace
j'ai l'impression que c'est mon stagiaire qui a écrit ce script (faute d'orthographe en moins)

- mauvaise indentation qui complique la lecture du script
- imbrication de boucle inutile (le do/until en plus du foreach)
- réutilisation/modification de la variable utilisé par la boucle foreach ($ligne)
sinon le script est bon si on enlève les redondances de boucle et la réutilisation frauduleuse de variable
je l'est pas tester, à toi de nous dire, voici la correction :
[code:1]
$NomfichierCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
$MonCsv = import-csv -Path $NomfichierCsv
foreach ($Ligne in $MonCsv) {
$ligne_splitted = $Ligne.split(\",\"«»)
$NOM_ECOLE = $ligne_splitted[0]
$ADDR_FW_LAN = $ligne_splitted[1]
$ADDR_POOL_DHCP_LAN = $ligne_splitted[2]
$ADDR_FW_WAN = $ligne_splitted[3]
$ADDR_MASK_WAN = $ligne_splitted[4]
$ADDR_GW_WAN = $ligne_splitted[5]
$MAC_FW = $ligne_splitted[6]
$tableau = @{
'<NOM_ECOLE>' = $NOM_ECOLE
'<ADDR_FW_LAN>' = $ADDR_FW_LAN
'<ADDR_POOL_DHCP_LAN>' = $ADDR_POOL_DHCP_LAN
'<ADDR_FW_WAN>' = $ADDR_FW_WAN
'<ADDR_MASK_WAN>' = $ADDR_MASK_WAN
'<ADDR_GW_WAN>' = $ADDR_GW_WAN
'<MAC_FW>' = $MAC_FW
}
$EmplacementFichierModele = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\"
$EmplacementNouveauFichier = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.$MAC_FW.clish\"
get-content -Path $EmplacementFichierModele | foreach-object {
$NewLigne = $_
$tableau.GetEnumerator() | ForEach-Object {
if ($NewLigne -match $_.Key){
$NewLigne = $NewLigne -replace $_.Key, $_.Value
}
}
$NewLigne
} | Set-Content -Path $EmplacementNouveauFichier
}
[/code:1]
petite info : puisse que tu a un fichier CSV il est inutile de faire des splits
tu peut utilisé le nom des colonnes de la premiere ligne du fichier CSV comme nom de propriété,
les nom utilisé ici sont des exemple :
[code:1]
# si le fichier contient seci :
#\"nom ecole\", fw_Lan, DHCP, FW_WAN, ADDR_MASK_WAN, passerelle, MAC_FW
#\"ecole jean mermoz\", \"192.168.10.200\", \"192.168.10.1-192.168.10.100\", \"192.168.10.250\", \"255.255.255.0\", \"192.168.10.254\", \"01-00-5e-7f-ff-fa\"
# code associer
$MonCsv = import-csv -Path $NomfichierCsv -Delimiter \",\"
.
.
.
$NOM_ECOLE = $ligne.\"nom ecole\"
$ADDR_FW_LAN = $ligne.fw_Lan
$ADDR_POOL_DHCP_LAN = $ligne.DHCP
$ADDR_FW_WAN = $ligne.FW_WAN
$ADDR_MASK_WAN = $ligne.ADDR_MASK_WAN
$ADDR_GW_WAN = $ligne.passerelle
$MAC_FW = $ligne.MAC_FW
[/code:1]c'est plus clair et $ligne_splitted devient inutile<br><br>Message édité par: 6ratgus, à: 5/06/18 14:47
- mauvaise indentation qui complique la lecture du script
- imbrication de boucle inutile (le do/until en plus du foreach)
- réutilisation/modification de la variable utilisé par la boucle foreach ($ligne)
sinon le script est bon si on enlève les redondances de boucle et la réutilisation frauduleuse de variable
je l'est pas tester, à toi de nous dire, voici la correction :
[code:1]
$NomfichierCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
$MonCsv = import-csv -Path $NomfichierCsv
foreach ($Ligne in $MonCsv) {
$ligne_splitted = $Ligne.split(\",\"«»)
$NOM_ECOLE = $ligne_splitted[0]
$ADDR_FW_LAN = $ligne_splitted[1]
$ADDR_POOL_DHCP_LAN = $ligne_splitted[2]
$ADDR_FW_WAN = $ligne_splitted[3]
$ADDR_MASK_WAN = $ligne_splitted[4]
$ADDR_GW_WAN = $ligne_splitted[5]
$MAC_FW = $ligne_splitted[6]
$tableau = @{
'<NOM_ECOLE>' = $NOM_ECOLE
'<ADDR_FW_LAN>' = $ADDR_FW_LAN
'<ADDR_POOL_DHCP_LAN>' = $ADDR_POOL_DHCP_LAN
'<ADDR_FW_WAN>' = $ADDR_FW_WAN
'<ADDR_MASK_WAN>' = $ADDR_MASK_WAN
'<ADDR_GW_WAN>' = $ADDR_GW_WAN
'<MAC_FW>' = $MAC_FW
}
$EmplacementFichierModele = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\"
$EmplacementNouveauFichier = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.$MAC_FW.clish\"
get-content -Path $EmplacementFichierModele | foreach-object {
$NewLigne = $_
$tableau.GetEnumerator() | ForEach-Object {
if ($NewLigne -match $_.Key){
$NewLigne = $NewLigne -replace $_.Key, $_.Value
}
}
$NewLigne
} | Set-Content -Path $EmplacementNouveauFichier
}
[/code:1]
petite info : puisse que tu a un fichier CSV il est inutile de faire des splits
tu peut utilisé le nom des colonnes de la premiere ligne du fichier CSV comme nom de propriété,
les nom utilisé ici sont des exemple :
[code:1]
# si le fichier contient seci :
#\"nom ecole\", fw_Lan, DHCP, FW_WAN, ADDR_MASK_WAN, passerelle, MAC_FW
#\"ecole jean mermoz\", \"192.168.10.200\", \"192.168.10.1-192.168.10.100\", \"192.168.10.250\", \"255.255.255.0\", \"192.168.10.254\", \"01-00-5e-7f-ff-fa\"
# code associer
$MonCsv = import-csv -Path $NomfichierCsv -Delimiter \",\"
.
.
.
$NOM_ECOLE = $ligne.\"nom ecole\"
$ADDR_FW_LAN = $ligne.fw_Lan
$ADDR_POOL_DHCP_LAN = $ligne.DHCP
$ADDR_FW_WAN = $ligne.FW_WAN
$ADDR_MASK_WAN = $ligne.ADDR_MASK_WAN
$ADDR_GW_WAN = $ligne.passerelle
$MAC_FW = $ligne.MAC_FW
[/code:1]c'est plus clair et $ligne_splitted devient inutile<br><br>Message édité par: 6ratgus, à: 5/06/18 14:47
Connexion ou Créer un compte pour participer à la conversation.
- Corentin
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 29
- Remerciements reçus 0
il y a 7 ans 11 mois #25521
par Corentin
Réponse de Corentin sur le sujet Re:la fonction -replace
[code:1]NOM_ECOLE,ADDR_FW_LAN,ADDR_POOL_DHCP_LAN,ADDR_FW_WAN,ADDR_MASK_WAN,ADDR_GW_WAN,MAC_FW
EM_CARTERET,192.168.10.1,192.168.10.1-192.168.10.2,192.168.10.1,255.255.255.0,192.168.10.1,00-1C-7F-7E-01-02[/code:1]
voici les deux premières lignes, les suivantes sont exactement pareils, je préfère ne pas les montrer j'ai pas envie d'avoir de problèmes je pense que les infos doivent rester confidentiel je prefere limiter la casse
(je ne sais pas pourquoi il y a un espace je n'arrive pas à éditer correctement mais rassurer vous il n'y a pas l'espace dans mon fichier)<br><br>Message édité par: Corentin, à: 5/06/18 14:48
EM_CARTERET,192.168.10.1,192.168.10.1-192.168.10.2,192.168.10.1,255.255.255.0,192.168.10.1,00-1C-7F-7E-01-02[/code:1]
voici les deux premières lignes, les suivantes sont exactement pareils, je préfère ne pas les montrer j'ai pas envie d'avoir de problèmes je pense que les infos doivent rester confidentiel je prefere limiter la casse
(je ne sais pas pourquoi il y a un espace je n'arrive pas à éditer correctement mais rassurer vous il n'y a pas l'espace dans mon fichier)<br><br>Message édité par: Corentin, à: 5/06/18 14:48
Connexion ou Créer un compte pour participer à la conversation.
- Corentin
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 29
- Remerciements reçus 0
il y a 7 ans 11 mois #25523
par Corentin
Réponse de Corentin sur le sujet Re:la fonction -replace
6ratgus écrit:
effectivement je suis en stage
J'ai pourtant passer 5 bonne minutes à éditer pour avoir une bonne indentation

Merci pour votre réponse je vais tester ça.
j'ai l'impression que c'est mon stagiaire qui a écrit ce script (faute d'orthographe en moins)
![]()
effectivement je suis en stage
J'ai pourtant passer 5 bonne minutes à éditer pour avoir une bonne indentation
Merci pour votre réponse je vais tester ça.
Connexion ou Créer un compte pour participer à la conversation.
- Corentin
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 29
- Remerciements reçus 0
il y a 7 ans 11 mois #25524
par Corentin
Réponse de Corentin sur le sujet Re:la fonction -replace
Grâce à vos réponses, mon programme fonctionne !!!

Merci énormément pour vos réponses !!
Cependant j'ai peut être une solution pour optimiser un peu le code (le moins de ligne possible) :
enlever la première étape
seulement ça me génere que la dernière ligne de mon fichier csv, ce n'est donc pas possible ?
[code:1]$NomfichierCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
$MonCsv = import-csv -Path \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\" -Delimiter \",\"
foreach ($Ligne in $MonCsv) {
$tableau = @{
'<NOM_ECOLE>' = $ligne.NOM_ECOLE
'<ADDR_FW_LAN>' = $ligne.ADDR_FW_LAN
'<ADDR_POOL_DHCP_LAN>' = $ligne.ADDR_POOL_DHCP_LAN
'<ADDR_FW_WAN>' = $ligne.ADDR_FW_WAN
'<ADDR_MASK_WAN>' = $ligne.ADDR_MASK_WAN
'<ADDR_GW_WAN>' = $ligne.ADDR_GW_WAN
'<MAC_FW>' = $ligne.MAC_FW
}
$EmplacementFichierModele = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\"
$EmplacementNouveauFichier = \"C:\Users\Corentin.FOURRIER\Documents\ListeEcole\autoconf.$MAC_FW.clish\"
get-content -Path $EmplacementFichierModele | foreach-object {
$NewLigne = $_
$tableau.GetEnumerator() | ForEach-Object {
if ($NewLigne -match $_.Key){
$NewLigne = $NewLigne -replace $_.Key, $_.Value
}
}
$NewLigne
} | Set-Content -Path $EmplacementNouveauFichier
}
[/code:1]<br><br>Message édité par: Corentin, à: 5/06/18 15:35
Merci énormément pour vos réponses !!
Cependant j'ai peut être une solution pour optimiser un peu le code (le moins de ligne possible) :
enlever la première étape
seulement ça me génere que la dernière ligne de mon fichier csv, ce n'est donc pas possible ?
[code:1]$NomfichierCsv = \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\"
$MonCsv = import-csv -Path \"C:\Users\Corentin.FOURRIER\Documents\ecoles1.csv\" -Delimiter \",\"
foreach ($Ligne in $MonCsv) {
$tableau = @{
'<NOM_ECOLE>' = $ligne.NOM_ECOLE
'<ADDR_FW_LAN>' = $ligne.ADDR_FW_LAN
'<ADDR_POOL_DHCP_LAN>' = $ligne.ADDR_POOL_DHCP_LAN
'<ADDR_FW_WAN>' = $ligne.ADDR_FW_WAN
'<ADDR_MASK_WAN>' = $ligne.ADDR_MASK_WAN
'<ADDR_GW_WAN>' = $ligne.ADDR_GW_WAN
'<MAC_FW>' = $ligne.MAC_FW
}
$EmplacementFichierModele = \"C:\Users\Corentin.FOURRIER\Documents\clish\autoconf.ADDR-MAC-MODELE.clish\"
$EmplacementNouveauFichier = \"C:\Users\Corentin.FOURRIER\Documents\ListeEcole\autoconf.$MAC_FW.clish\"
get-content -Path $EmplacementFichierModele | foreach-object {
$NewLigne = $_
$tableau.GetEnumerator() | ForEach-Object {
if ($NewLigne -match $_.Key){
$NewLigne = $NewLigne -replace $_.Key, $_.Value
}
}
$NewLigne
} | Set-Content -Path $EmplacementNouveauFichier
}
[/code:1]<br><br>Message édité par: Corentin, à: 5/06/18 15:35
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.047 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Résolu]la fonction -replace