Question
Incrémentation de chaines ??
- Laurent
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 1
- Remerciements reçus 0
il y a 14 ans 9 mois #9727
par Laurent
Incrémentation de chaines ?? a été créé par Laurent
Bonjour,
Je suis en train de faire un script d'inventoring en powershell. Pour ce qui est de la fonction première de mon script je ne rencontre pas trop de soucis cependant je ne parviens pas à faire ma sortie comme je le désirerais, la plupart des machines ayant plusieurs cartes réseaux et parfois plusieurs IP par carte.
Avec ce script:
[code:1]$liste=\"C:\Scripts\Serverlist.csv\"
$invent=\"C:\Scripts\ServerInvent.csv\"
Get-Content $liste |
ForEach-Object {$nom=$_;$test=gwmi Win32_PingStatus -filter (\"address='\"+$nom+\"'\"«»)
if ($test.StatusCode -eq 0) {
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $nom |
ForEach-Object {Add-Content $invent ($nom+\" \"+$_.IPAddress+\" \"+$_.MACAddress+\" \"+$_.DefaultIPGateway)}
}
else{
Add-Content $invent $nom\" Machine Injoignable\"}
}[/code:1]
J'obtiens une sortie sous la forme:
[code:1]Machine1 IP1 MAC1 Passerelle1
Machine1 IP2a,IP2b MAC2 passerelle2[/code:1]
Idéalement j'aurais souhaité ce genre de résultat:
[code:1]Machine1 IP1 carte1 MAC1 Passerelle1 IP2a,IP2b carte2 MAC2 passerelle2[/code:1]
De plus que par la suite je compte rajouter des appelles de classes wmi supplémentaires et un:
[code:1]$liste=\"C:\Scripts\Serverlist.csv\"
$invent=\"C:\Scripts\ServerInvent.csv\"
Get-Content $liste |
ForEach-Object {$nom=$_;$test=gwmi Win32_PingStatus -filter (\"address='\"+$nom+\"'\"«»)
if ($test.StatusCode -eq 0) {
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $nom |
ForEach-Object {Add-Content $invent ($nom+\" \"+$_.IPAddress+\" \"+$_.MACAddress+\" \"+$_.DefaultIPGateway)}
gwmi Win32_Bios -ComputerName $nom |
ForEach-Object {Add-Content $invent (\" \"+$_.Manufacturer)}
}
else{
Add-Content $invent $nom\" Machine Injoignable\"}
}[/code:1]
Me fait des sorties du même type avec une ligne en plus:
[code:1]Machine1 IP1 MAC1 Passerelle1
Machine1 IP2a,IP2b MAC2 passerelle2
Machine1 Manufacturer[/code:1]
Bref le code en soit je le comprend mais pouvoir maitriser correctement ces sortis là je ne trouve pas. J'ai tenté de variabiliser mes requêtes mais mon problème est avant quoi qu'il en soit et là je plante
Je suis en train de faire un script d'inventoring en powershell. Pour ce qui est de la fonction première de mon script je ne rencontre pas trop de soucis cependant je ne parviens pas à faire ma sortie comme je le désirerais, la plupart des machines ayant plusieurs cartes réseaux et parfois plusieurs IP par carte.
Avec ce script:
[code:1]$liste=\"C:\Scripts\Serverlist.csv\"
$invent=\"C:\Scripts\ServerInvent.csv\"
Get-Content $liste |
ForEach-Object {$nom=$_;$test=gwmi Win32_PingStatus -filter (\"address='\"+$nom+\"'\"«»)
if ($test.StatusCode -eq 0) {
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $nom |
ForEach-Object {Add-Content $invent ($nom+\" \"+$_.IPAddress+\" \"+$_.MACAddress+\" \"+$_.DefaultIPGateway)}
}
else{
Add-Content $invent $nom\" Machine Injoignable\"}
}[/code:1]
J'obtiens une sortie sous la forme:
[code:1]Machine1 IP1 MAC1 Passerelle1
Machine1 IP2a,IP2b MAC2 passerelle2[/code:1]
Idéalement j'aurais souhaité ce genre de résultat:
[code:1]Machine1 IP1 carte1 MAC1 Passerelle1 IP2a,IP2b carte2 MAC2 passerelle2[/code:1]
De plus que par la suite je compte rajouter des appelles de classes wmi supplémentaires et un:
[code:1]$liste=\"C:\Scripts\Serverlist.csv\"
$invent=\"C:\Scripts\ServerInvent.csv\"
Get-Content $liste |
ForEach-Object {$nom=$_;$test=gwmi Win32_PingStatus -filter (\"address='\"+$nom+\"'\"«»)
if ($test.StatusCode -eq 0) {
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $nom |
ForEach-Object {Add-Content $invent ($nom+\" \"+$_.IPAddress+\" \"+$_.MACAddress+\" \"+$_.DefaultIPGateway)}
gwmi Win32_Bios -ComputerName $nom |
ForEach-Object {Add-Content $invent (\" \"+$_.Manufacturer)}
}
else{
Add-Content $invent $nom\" Machine Injoignable\"}
}[/code:1]
Me fait des sorties du même type avec une ligne en plus:
[code:1]Machine1 IP1 MAC1 Passerelle1
Machine1 IP2a,IP2b MAC2 passerelle2
Machine1 Manufacturer[/code:1]
Bref le code en soit je le comprend mais pouvoir maitriser correctement ces sortis là je ne trouve pas. J'ai tenté de variabiliser mes requêtes mais mon problème est avant quoi qu'il en soit et là je plante
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 14 ans 9 mois #9730
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Incrémentation de chaines ??
Salut,
minux écrit:
Je ne pense pas que ce soit la bonne approche, car les évolutions :
minux écrit:
minux écrit:
)
Avant de penser à la fin, le résultat, pense au début, l'objet qui portera tes informations.
Une fois ceci fait, l'affichage via un traitement distinct s'en trouvera facilité.
Une possible approche :
[code:1]
$Servers=\"C:\Scripts\Serverlist.csv\"
$RapportInventaire=\"C:\Scripts\ServerInvent.csv\"
$Result=Get-Content $Servers|
ForEach-Object {
#Construit un objet par serveur
$Current=New-Object PSObject -Property @{Name=$_;
#Collection d'adapters réseau en suspend
NetworkAdapters=$null;
#Propriété statique
#Ce pourrait être une propriété calculée...
IsActiv=$((gwmi Win32_PingStatus -filter \"address='$ServerName'\"«»).StatusCode -eq 0)
}
if ($Current.IsActiv)
{
#Création de la collection d'adapters réseau
$Current.NetworkAdapters=New-Object System.Collections.ArrayList
#Complète les propriétés de l'objet si le serveur répond
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $Current.Name|
#On crée un objet à partir des seules propriétés de l'adapter qui nous intéresse
Select-Object IPAddress,MacAddress,DefaultIPGateway|
Foreach-Object {
#On ajoute l'adapter personnalisé à la collection
[void]$Current.NetworkAdapters.Add($_)
}
}
#Emet l'objet dans le pipe
$Current
}
#Essai d'affichage
$Result|
Where {$_.isActiv}|
Foreach {
#Construit une chaîne
@\"
$($_.Name) $(Foreach ($NetAdapt in $_.NetworkAdapters) { #Code imbriqué, level 1
Foreach ($IP in $NetAdapt.IPAddress) {
\"$IP $($NetAdapt.MacAddress) $(
#Code imbriqué, level 2
if ($NetAdapt.DefaultIPGateway -eq $null)
{\"NoGateway\"}
else
{$NetAdapt.DefaultIPGateway})\"
}#Foreach $IP
}#Foreach $NetAdapt
)#Group
\"@
} #|Set-Content $RapportInventaire
[/code:1]
Sous réserve que l'affichage corresponde.
On voit bien que des facilités de reporting font défaut sous PowerShell...
minux écrit:
D'accord, mais le pb est que tu conçois ton script d'après ton affichage.Idéalement j'aurais souhaité ce genre de résultat:
Je ne pense pas que ce soit la bonne approche, car les évolutions :
minux écrit:
seront mal aisées étant donné que tu couples deux traitements distincts.par la suite je compte rajouter des appels de classes wmi
minux écrit:
A mon avis essaie déjà de construire un objet personnalisé qui agrége les différentes informations, tout en ayant à l'esprit ses possibles évolutions(plus facile à dire qu'a faireBref le code en soit je le comprend mais pouvoir maitriser correctement ces sortis là je ne trouve pas.
Avant de penser à la fin, le résultat, pense au début, l'objet qui portera tes informations.
Une fois ceci fait, l'affichage via un traitement distinct s'en trouvera facilité.
Une possible approche :
[code:1]
$Servers=\"C:\Scripts\Serverlist.csv\"
$RapportInventaire=\"C:\Scripts\ServerInvent.csv\"
$Result=Get-Content $Servers|
ForEach-Object {
#Construit un objet par serveur
$Current=New-Object PSObject -Property @{Name=$_;
#Collection d'adapters réseau en suspend
NetworkAdapters=$null;
#Propriété statique
#Ce pourrait être une propriété calculée...
IsActiv=$((gwmi Win32_PingStatus -filter \"address='$ServerName'\"«»).StatusCode -eq 0)
}
if ($Current.IsActiv)
{
#Création de la collection d'adapters réseau
$Current.NetworkAdapters=New-Object System.Collections.ArrayList
#Complète les propriétés de l'objet si le serveur répond
gwmi Win32_NetworkAdapterConfiguration -filter IPEnabled=True -ComputerName $Current.Name|
#On crée un objet à partir des seules propriétés de l'adapter qui nous intéresse
Select-Object IPAddress,MacAddress,DefaultIPGateway|
Foreach-Object {
#On ajoute l'adapter personnalisé à la collection
[void]$Current.NetworkAdapters.Add($_)
}
}
#Emet l'objet dans le pipe
$Current
}
#Essai d'affichage
$Result|
Where {$_.isActiv}|
Foreach {
#Construit une chaîne
@\"
$($_.Name) $(Foreach ($NetAdapt in $_.NetworkAdapters) { #Code imbriqué, level 1
Foreach ($IP in $NetAdapt.IPAddress) {
\"$IP $($NetAdapt.MacAddress) $(
#Code imbriqué, level 2
if ($NetAdapt.DefaultIPGateway -eq $null)
{\"NoGateway\"}
else
{$NetAdapt.DefaultIPGateway})\"
}#Foreach $IP
}#Foreach $NetAdapt
)#Group
\"@
} #|Set-Content $RapportInventaire
[/code:1]
Sous réserve que l'affichage corresponde.
On voit bien que des facilités de reporting font défaut sous PowerShell...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.037 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Incrémentation de chaines ??