Question
Extraire les 3 premiers blocs d'une adresse IP
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 9 ans 1 mois #23078
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Tu mélanges tout :/
Le $_ est utilisé dans un segment de pipeline :
[code:1]
Dir|Foreach-Object {$_.Name}
[/code:1]
Ensuite tu ne références pas ta variable $IP dans la boucle Foreach, c'est gênant.
Enfin tu réenregistres le contenu d'origine de $IPS, re :/
Encore une fois l'intérêt d'utiliser une variable de type IpAddress ajoute un contrôle de validité des données sans avoir à le coder.
On peut faire du parsing mais il faut connaitre les expressions régulières.
En utilisant une fonction (que tu testes) ton code s'en trouverais faciliter.
Je reconnais que ce que j'ai proposé est dense pour un débutant j'aurais du l'écrire plus simplement.
Si j'ai le temps je te ferais çà demain tu gagneras du temps je pense.
Le $_ est utilisé dans un segment de pipeline :
[code:1]
Dir|Foreach-Object {$_.Name}
[/code:1]
Ensuite tu ne références pas ta variable $IP dans la boucle Foreach, c'est gênant.
Enfin tu réenregistres le contenu d'origine de $IPS, re :/
Encore une fois l'intérêt d'utiliser une variable de type IpAddress ajoute un contrôle de validité des données sans avoir à le coder.
On peut faire du parsing mais il faut connaitre les expressions régulières.
En utilisant une fonction (que tu testes) ton code s'en trouverais faciliter.
Je reconnais que ce que j'ai proposé est dense pour un débutant j'aurais du l'écrire plus simplement.
Si j'ai le temps je te ferais çà demain tu gagneras du temps je pense.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 9 ans 1 mois #23079
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Une proposition :
[code:1]
$File='C:\temp\IPDatas.csv'
@'
AdresseIP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.2502.18.47
10.250.218.47
'@ > $File
Function ConvertTo-SlicedIP {
param (
[string] $Address
)
Write-Debug \"Current data : $Address\"
#tente la transformation d'une chaine en une adresse IP
$ipAddress=[ipAddress]::«»Parse($Address)
Write-Debug \"Current IP: $ipAddress\"
$ofs='.'
#on ne prend que les 3 premiers champs
$Tab=$ipAddress.GetAddressBytes()
$SlicedIP=$Tab[0..2]
# \"$SlicedIP\" -> on transforme un tableau en une string en utilisant $OFS
$result=\"$SlicedIP\" + \".\"
Write-Debug \"'New' IP: $Result\"
#Emet le résultat dans le pipeline
Write-Output $Result
}#ConvertTo-SlicedIP
$IPs=Import-csv $File -UseCulture
$DebugPreference='Continue'
ConvertTo-SlicedIP $ips[0].AdresseIP
$DebugPreference='SilentlyContinue'
foreach ($ip in $IPs)
{
try {
$MyIP=ConvertTo-SlicedIP $ip.AdresseIP
} catch [System.FormatException]{
Write-Error \"$_`r`n$Ip. \"
continue
}
#Sinon on propage les autres type d'exception , c'est un bug ou un cas qui n'est pas géré
Write-host \"La suite avec '$MyIP'\"
#...
}
[/code:1]
[code:1]
$File='C:\temp\IPDatas.csv'
@'
AdresseIP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.2502.18.47
10.250.218.47
'@ > $File
Function ConvertTo-SlicedIP {
param (
[string] $Address
)
Write-Debug \"Current data : $Address\"
#tente la transformation d'une chaine en une adresse IP
$ipAddress=[ipAddress]::«»Parse($Address)
Write-Debug \"Current IP: $ipAddress\"
$ofs='.'
#on ne prend que les 3 premiers champs
$Tab=$ipAddress.GetAddressBytes()
$SlicedIP=$Tab[0..2]
# \"$SlicedIP\" -> on transforme un tableau en une string en utilisant $OFS
$result=\"$SlicedIP\" + \".\"
Write-Debug \"'New' IP: $Result\"
#Emet le résultat dans le pipeline
Write-Output $Result
}#ConvertTo-SlicedIP
$IPs=Import-csv $File -UseCulture
$DebugPreference='Continue'
ConvertTo-SlicedIP $ips[0].AdresseIP
$DebugPreference='SilentlyContinue'
foreach ($ip in $IPs)
{
try {
$MyIP=ConvertTo-SlicedIP $ip.AdresseIP
} catch [System.FormatException]{
Write-Error \"$_`r`n$Ip. \"
continue
}
#Sinon on propage les autres type d'exception , c'est un bug ou un cas qui n'est pas géré
Write-host \"La suite avec '$MyIP'\"
#...
}
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vega
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 8
- Remerciements reçus 0
il y a 9 ans 1 mois #23080
par Vega
Réponse de Vega sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Merci Laurent, j'ai copié ton code dans ma console PS pour essayer de comprendre, merci de l'avoir commenté ça va aider.
Par contre tu es allé plus loin, tu utilises pas mal de choses, va falloir que je digère le tout
J'espère qu'il y a quand même plus simple au début de faire ce que je souhaite avec mon CSV 
Le résultat est sympa, tu détectes une adresse IP qui n'est pas au format.
[code:1]
PS C:\Users> C:\temp\script_laurent.ps1
DÉBOGUER : Current data : 10.210.60.39
DÉBOGUER : Current IP: 10.210.60.39
DÉBOGUER : 'New' IP: 10.210.60.
10.210.60.
La suite avec '10.210.60.'
La suite avec '10.220.105.'
La suite avec '10.230.177.'
La suite avec '10.240.117.'
C:\temp\script_laurent.ps1 : Une adresse IP non valide a été spécifiée.
@{AdresseIP=10.2502.18.47}.
+ CategoryInfo : NotSpecified: (:«») [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,script_laurent.ps1
La suite avec '10.250.218.'
[/code:1]
Par contre tu es allé plus loin, tu utilises pas mal de choses, va falloir que je digère le tout
Le résultat est sympa, tu détectes une adresse IP qui n'est pas au format.
[code:1]
PS C:\Users> C:\temp\script_laurent.ps1
DÉBOGUER : Current data : 10.210.60.39
DÉBOGUER : Current IP: 10.210.60.39
DÉBOGUER : 'New' IP: 10.210.60.
10.210.60.
La suite avec '10.210.60.'
La suite avec '10.220.105.'
La suite avec '10.230.177.'
La suite avec '10.240.117.'
C:\temp\script_laurent.ps1 : Une adresse IP non valide a été spécifiée.
@{AdresseIP=10.2502.18.47}.
+ CategoryInfo : NotSpecified: (:«») [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,script_laurent.ps1
La suite avec '10.250.218.'
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 9 ans 1 mois #23082
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Vega écrit:

Ce n'est pas parce que l'énoncé du problème est simple que sa réalisation l'est.
L'usage de fonction permet de 'zoomer/dézoomer' et facilite la relecture et à moins de dire \"mon fichier ne contiendra JAMAIS d'erreur\" la gestion d'exception est nécessaire.
C'est comme pour le fichier csv tu supposes qu'il existe et qu'il est renseigné.
C'est une manière de faire, on peut aussi choisir de débugger dans l'urgence en prod
C'est toi qui décide.
Tu enlèves la fonction et la gestion d'erreurJ'espère qu'il y a quand même plus simple au début de faire ce que je souhaite avec mon CSV
Ce n'est pas parce que l'énoncé du problème est simple que sa réalisation l'est.
L'usage de fonction permet de 'zoomer/dézoomer' et facilite la relecture et à moins de dire \"mon fichier ne contiendra JAMAIS d'erreur\" la gestion d'exception est nécessaire.
C'est comme pour le fichier csv tu supposes qu'il existe et qu'il est renseigné.
C'est une manière de faire, on peut aussi choisir de débugger dans l'urgence en prod
C'est toi qui décide.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Marc
- Hors Ligne
- Membre premium
-
Réduire
Plus d'informations
- Messages : 90
- Remerciements reçus 0
il y a 9 ans 1 mois #23086
par Marc
Réponse de Marc sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Un truc de ce style devrais pas être mal.
Après il faut savoir ce que tu attends en finalité de ton script.
[code:1]
########
#region Fonctions Récupération des 3 premiers octets d'une IP
#####
function ConvertTo-SlicedIP{
param([string]$address)
try{ #- On verifie si on a une ip valide
Set-Variable -Name IPaddress -Value ([ipaddress]::«»Parse($address)) -ErrorAction stop
#- Si ip valide on prend les 3 premiers octets
$ofs='.'
$Tab=$IPaddress.GetAddressBytes()
$SliceIP=$Tab[0..2]
$result = \"$SliceIP\"+\".\"
return $result
}
catch [System.FormatException]{ #- En cas d'ip non valide on écrit l'erreur et on retourne stop
Write-Error \"$_`r`n$address. \"
return 'stop'
}
}
function SliceAndStoringIP{
param($CSVData)
#- On initialise un tableau de data
$TabOfSliceIP = @()
foreach($ip in $CSVData){
#- On découpe notre ip
$SlicedIP = ConvertTo-SlicedIP -address $ip
if($SlicedIP -ne 'stop'){#- Si on a une ip découpé et non stop
#- on la stock dans notre tableau de data
$TabOfSliceIP+=New-Object psobject -Property @{'SlicedIP'=$SlicedIP}
}
}
#- on renvoi notre beau tableau
return $TabOfSliceIP
}
#endregion
########
#- On récupère nos IP
$ips = Import-Csv 'c:\temp\adresse_ip.csv' -UseCulture
#- On les envois dans notre fonction pour découpage
$StoredSliceIP = SliceAndStoringIP -CSVData $ips.AdresseIP
#- Pour finir on envoi le résultat dans un csv
$StoredSliceIP | Export-Csv -Path 'c:\temp\SlicedIP.csv' -UseCulture -NoTypeInformation
[/code:1]
Après il faut savoir ce que tu attends en finalité de ton script.
[code:1]
########
#region Fonctions Récupération des 3 premiers octets d'une IP
#####
function ConvertTo-SlicedIP{
param([string]$address)
try{ #- On verifie si on a une ip valide
Set-Variable -Name IPaddress -Value ([ipaddress]::«»Parse($address)) -ErrorAction stop
#- Si ip valide on prend les 3 premiers octets
$ofs='.'
$Tab=$IPaddress.GetAddressBytes()
$SliceIP=$Tab[0..2]
$result = \"$SliceIP\"+\".\"
return $result
}
catch [System.FormatException]{ #- En cas d'ip non valide on écrit l'erreur et on retourne stop
Write-Error \"$_`r`n$address. \"
return 'stop'
}
}
function SliceAndStoringIP{
param($CSVData)
#- On initialise un tableau de data
$TabOfSliceIP = @()
foreach($ip in $CSVData){
#- On découpe notre ip
$SlicedIP = ConvertTo-SlicedIP -address $ip
if($SlicedIP -ne 'stop'){#- Si on a une ip découpé et non stop
#- on la stock dans notre tableau de data
$TabOfSliceIP+=New-Object psobject -Property @{'SlicedIP'=$SlicedIP}
}
}
#- on renvoi notre beau tableau
return $TabOfSliceIP
}
#endregion
########
#- On récupère nos IP
$ips = Import-Csv 'c:\temp\adresse_ip.csv' -UseCulture
#- On les envois dans notre fonction pour découpage
$StoredSliceIP = SliceAndStoringIP -CSVData $ips.AdresseIP
#- Pour finir on envoi le résultat dans un csv
$StoredSliceIP | Export-Csv -Path 'c:\temp\SlicedIP.csv' -UseCulture -NoTypeInformation
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 9 ans 1 mois #23088
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Extraire les 3 premiers blocs d'une adresse IP
Il ne faut pas modifier la gestion d'exception ainsi.
Avec ton approche tu recodes sur le principe des codes de retour des apis win32 :/
S'il y a une autre type d'exception déclenchée dans ConvertTo-SlicedIP on fait quoi dans SliceAndStoringIP ?
Que la gestion d'exception dans le code proposée puisse être améliorée c'est fort probable, mais pas comme ça.
Avec ton approche tu recodes sur le principe des codes de retour des apis win32 :/
S'il y a une autre type d'exception déclenchée dans ConvertTo-SlicedIP on fait quoi dans SliceAndStoringIP ?
Que la gestion d'exception dans le code proposée puisse être améliorée c'est fort probable, mais pas comme ça.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.053 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Extraire les 3 premiers blocs d'une adresse IP