Question Extraire les 3 premiers blocs d'une adresse IP

Plus d'informations
il y a 9 ans 1 mois #23040 par Vega
Bonjour,

Je suis débutant en Powershell. Après une journée de prise de tête où je souhaitais absolument trouver la solution par moi-même, je suis obligé de me résoudre à demander de l'aide...

La version simplifié de ce que je souhaite faire c'est : extraire les 3 premiers blocs d'une adresse IP, quel que soit le nombre de digits entre chaque point, en gardant le derniers point.

Exemple pour l'adresse IP \"192.168.1.100\", je souhaite avoir en résultat \"192.168.1.\"

Le mieux que j'ai réussi à avoir ce sont les 3 premiers blocs mais sans les . Voici mon code, qui est sans doute à modifier entièrement :

[code:1]
$a='192.168.1.100'
foreach ($ip in $a) {
#$split = $ip.split(\".\"«»)
[string]$split[0..($Split.count-2)]
}
[/code:1]

Le résultat est :

PS C:\Powershell> C:\Powershell\Adresse IP.ps1
192 168 1


Merci aux experts pour votre aide.
Je détaillerai ensuite plus précisément l'environnement dans lequel se trouve l'adresse IP.

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

Plus d'informations
il y a 9 ans 1 mois #23045 par Laurent Dardenne
Salut,
une solution
[code:1]
#On type l'adresse
[ipAddress]$a='192.168.1.100'

#Get-Help about_Automatic_Variables|More
$ofs='.'

#Split + énumération + convert string +$OFS
\"$(($a.GetAddressBytes())[0..2])\"
192.168.1
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 1/02/17 22:45

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 1 mois #23062 par Vega
Bonjour Laurent,

Un grand merci! Ca fonctionne! Je ne sais pas comment tu as pu trouver ça, même en relisant le code ça ne me parle pas.

J'ai dû rajouter

+ \&quot; \&quot;

dans la dernière ligne pour avoir le dernier point dans l'adresse IP, c'est tout bon maintenant.

[code:1]\&quot;$(($a.GetAddressBytes())[0..2] + \&quot; \&quot;«»)\&quot;[/code:1]

Résultat :

192.168.1.


Je continue mon cheminement en dévoilant la suite de ce que j'essaye de faire. Mes adresses IP se trouvent dans un fichier CSV ayant en entête \&quot;Adresse IP\&quot; :
[code:1]
Adresse IP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.250.218.47
[/code:1]
J'arrive à importer le CSV et à le lister, par contre l'intégration de ton code ne passe pas, et je n'arrive pas à trouver pourquoi :
[code:1]
$csvfile = \&quot;C:\Powershell\A*.csv\&quot;

Import-CSV $csvfile -Delimiter \&quot;;\&quot;

Foreach ($ip in $csvfile) {
$ofs='.'
$NewIP=\&quot;$(($_.GetAddressBytes())[0..2] + \&quot; \&quot;«»)\&quot;
}
Write-host $NewIP
[/code:1]

Pour parcourir tous les enregistrements, j'ai transformé la ligne

\&quot;$(($a.GetAddressBytes())[0..2] + \&quot; \&quot;)\&quot;

en

\&quot;$(($_.GetAddressBytes())[0..2] + \&quot; \&quot;)\&quot;


Ca me donne l'erreur suivante :
[code:1]
PS C:\Powershell&gt; C:\Powershell\Print.ps1

Adresse IP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.250.218.47
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de C:\Powershell\Print.ps1 : 7 Caractère : 20
+ ($_.GetAddressBytes &lt;&lt;&lt;&lt; ())[0..2] + \&quot; \&quot;
+ CategoryInfo : InvalidOperation: (GetAddressBytes:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
[/code:1]

Je cherche en parallèle, sans résultat cette matinée pour le moment.

Je vous remercie pour votre aide.

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

Plus d'informations
il y a 9 ans 1 mois #23063 par Vega
Bonjour Laurent,

Un grand merci! Ca fonctionne! Je ne sais pas comment tu as pu trouver ça, même en relisant le code ça ne me parle pas.

J'ai dû rajouter

+ \&quot; \&quot;

dans la dernière ligne pour avoir le dernier point dans l'adresse IP, c'est tout bon maintenant.

[code:1]\&quot;$(($a.GetAddressBytes())[0..2] + \&quot; \&quot;«»)\&quot;[/code:1]

Résultat :

192.168.1.


Je continue mon cheminement en dévoilant la suite de ce que j'essaye de faire. Mes adresses IP se trouvent dans un fichier CSV ayant en entête \&quot;Adresse IP\&quot; :
[code:1]
Adresse IP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.250.218.47
[/code:1]
J'arrive à importer le CSV et à le lister, par contre l'intégration de ton code ne passe pas, et je n'arrive pas à trouver pourquoi :
[code:1]
$csvfile = \&quot;C:\Powershell\A*.csv\&quot;

Import-CSV $csvfile -Delimiter \&quot;;\&quot;

Foreach ($ip in $csvfile) {
$ofs='.'
$NewIP=\&quot;$(($_.GetAddressBytes())[0..2] + \&quot; \&quot;«»)\&quot;
}
Write-host $NewIP
[/code:1]

Pour parcourir tous les enregistrements, j'ai transformé la ligne

\&quot;$(($a.GetAddressBytes())[0..2] + \&quot; \&quot;)\&quot;

en

\&quot;$(($_.GetAddressBytes())[0..2] + \&quot; \&quot;)\&quot;


Ca me donne l'erreur suivante :
[code:1]
PS C:\Powershell&gt; C:\Powershell\Print.ps1

Adresse IP
10.210.60.39
10.220.105.50
10.230.177.47
10.240.117.80
10.250.218.47
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de C:\Powershell\Print.ps1 : 7 Caractère : 20
+ ($_.GetAddressBytes &lt;&lt;&lt;&lt; ())[0..2] + \&quot; \&quot;
+ CategoryInfo : InvalidOperation: (GetAddressBytes:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
[/code:1]

Je cherche en parallèle, sans résultat cette matinée pour le moment.

Je vous remercie pour votre aide.

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

Plus d'informations
il y a 9 ans 1 mois #23064 par Laurent Dardenne
Vega écrit:

Je ne sais pas comment tu as pu trouver ça

Powersehll est basé sur la framework dotnet, il faut regarder/chercher les classes qui peuvent aider dans les tâches d'infra.
Ensuite ce n'est qu'un assemblage de comportements de PS. Je pourrais de le décomposer en + lignes, une par étape.

Vega écrit:

J'arrive à importer le CSV et à le lister, par contre l'intégration de ton code ne passe pas, et je n'arrive pas à trouver pourquoi :

Peut être en lisant les commentaires :-)
[code:1]
#On type l'adresse
[ipAddress]$a='192.168.1.100'
[/code:1]
Sinon import-csv renvoit de objets de type string et/ou ayant des propriétés de type string/scalaire.
Il faut typer ton objet afin d'utiliser les méthodes de la classe ciblée.
Là ce n'est plus le framework mais un principe de base de la programmation orienté objet.
Dans ton cas on sait par le nom de la colonne du csv que c'est une adresse Ip, mais PS n'en sait rien, faut l'aider :-)
Le typage permet également de connaitre les ligne du csv en erreur, il faut donc prévoir une gestion d'exception: Ceinture/Bretelle/Parachute.

Je te propose de créer une fonction ConvertTo-MyIpAddress qui transforme ton info de départ dans le format voulu, ce qui faciliteras la lecture du code.
Et $Ofs étant de portée locale sa déclaration n'affectera pas le code appelant.

Et l'erreur indiquée découle de l'absence de typage, bien que ceci soit plus mieux :
[code:1]
Foreach ($ip in Import-CSV $csvfile -Delimiter \&quot;;\&quot;«»)
[/code:1]
Sinon tu itéres sur $csvfile qui est une string, c'est à dire un tableau de [char]
:-)

Tutoriels PowerShell

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

Plus d'informations
il y a 9 ans 1 mois #23066 par Vega
Ok merci Laurent pour tes lumières. Je vais lire et relire tout ça pour essayer de l'intégrer et le comprendre. Je me laisse quelques heures pour corriger mon script et faire des tests. Je referai un tour par ici si je bloque vraiment :-)

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

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