Question pb changement valeur variable dans une fonction

Plus d'informations
il y a 11 ans 9 mois #17567 par callac
Je viens solliciter votre aide car j'ai ma variable $remotehost qui ne change pas de valeur à la ré exécution de la fonction. Je découvre les fonctions je penses ne pas maitriser ni comprendre ce qu'il se passe dans ce cas

[code:1]
# La variable $IPtextBox contiendra l'IP renseignée
$IPtextBox = \"192.168.0.254\"


function Test-Connexion
{
param([parameter(ValueFromPipeline=$True)]
[string]$RemoteHost = \"HostnameOrIPAddress\"
)

# Rableau de correspondance entre les valeurs de retour et leur signification :
# (source: msdn2.microsoft.com/fr-fr/library/aa394350.aspx)
$pingstatusref = @{ }
$pingstatusref[0] = \"Success\"
$pingstatusref[11001] = \"Buffer Too Small\"
$pingstatusref[11002] = \"Destination Net Unreachable\"
$pingstatusref[11003] = \"Destination Host Unreachable\"
$pingstatusref[11004] = \"Destination Protocol Unreachable\"
$pingstatusref[11005] = \"Destination Port Unreachable\"
$pingstatusref[11006] = \"No Resources\"
$pingstatusref[11007] = \"Bad Option\"
$pingstatusref[11008] = \"Hardware Error\"
$pingstatusref[11009] = \"Packet Too Big\"
$pingstatusref[11010] = \"Request Timed Out\"
$pingstatusref[11011] = \"Bad Request\"
$pingstatusref[11012] = \"Bad Route\"
$pingstatusref[11013] = \"TimeToLive Expired Transit\"
$pingstatusref[11014] = \"TimeToLive Expired Reassembly\"
$pingstatusref[11015] = \"Parameter Problem\"
$pingstatusref[11016] = \"Source Quench\"
$pingstatusref[11017] = \"Option Too Big\"
$pingstatusref[11018] = \"Bad Destination\"
$pingstatusref[11032] = \"Negotiating IPSEC\"
$pingstatusref[11050] = \"General Failure\"

foreach ($RemoteHostList in $RemoteHos)
{

# Requêle WQL pour le ping
$ping = \"select * from win32_pingstatus where address = '\" + $RemoteHost + \"'\"

# Récupération du résultat du ping
$pingstatus = Get-WmiObject -Query $ping

# La correspondance entre $pingstatus.StatusCode et le tableau $pingstatusref
$statustext = $pingstatusref[[int]$pingstatus.StatusCode]

# La variable pingstatus.Address est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
$Address = $pingstatus.Address

# Time elapsed to handle the request
[string]$ResponseTime = $pingstatus.ResponseTime

# La variable $statustext est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
[string]$statutIP = $statustext
}
}

Test-Connexion -RemoteHost $IPtextBox

switch ($IPtextBox)
{
{($pingstatus.StatusCode -eq \"0\"«»)}{Write-Host \"Ping $IPtextBox => OK en $ResponseTime ms\"}
Default {break }

}
[/code:1]

Merci d'avance pour votre aide :)

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

Plus d'informations
il y a 11 ans 9 mois #17568 par Laurent Dardenne
Salut,
si tu utilises ceci :
[code:1][parameter(ValueFromPipeline=$True)][/code:1]
ta fonction doit avoir un bloc process.

Et ici:
[code:1]foreach ($RemoteHostList in $RemoteHos) [/code:1]
J'ai un doute sur ta construction. Peut être comme ceci :
[code:1]foreach ($Host in $RemoteHost) [/code:1]
Mais ta variable $RemoteHost est déclarée comme une strinq et pas un tableau de string( [string[]], ta boucle itère une fois.
Et cela me semble contradictoire avec l'usage de ValueFromPipeline.
Reste à savoir si c'est ceci que tu veux faire :
[code:1]
$HostParis=@( '1.2.3.4', '5.6.7.8')
#etc
$HostParis,$HostTokyo,$HostMoscou|Test-Connexion
[/code:1]
Quelques tutoriaux .<br><br>Message édité par: Laurent Dardenne, à: 5/06/14 09:54

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 9 mois #17577 par callac
Bonjour Laurent,

J'ai parcouru le document les fonctions et scripts avancées sous powershell v2. J'ai effectué de mineures modifications ayant mieux compris le fonctionnement des paramètres ;)

[code:1]
# La variable $IPtextBox contiendra l'IP renseignée
$IPtextBox = \&quot;10.12.142.9\&quot;


function Test-Connexion
{
param([Parameter(Mandatory=$True)]
[string]$RemoteHost = \&quot;HostnameOrIPAddress\&quot;
)

# Rableau de correspondance entre les valeurs de retour et leur signification :
# (source: msdn2.microsoft.com/fr-fr/library/aa394350.aspx)
$pingstatusref = @{ }
$pingstatusref[0] = \&quot;Success\&quot;
$pingstatusref[11001] = \&quot;Buffer Too Small\&quot;
$pingstatusref[11002] = \&quot;Destination Net Unreachable\&quot;
$pingstatusref[11003] = \&quot;Destination Host Unreachable\&quot;
$pingstatusref[11004] = \&quot;Destination Protocol Unreachable\&quot;
$pingstatusref[11005] = \&quot;Destination Port Unreachable\&quot;
$pingstatusref[11006] = \&quot;No Resources\&quot;
$pingstatusref[11007] = \&quot;Bad Option\&quot;
$pingstatusref[11008] = \&quot;Hardware Error\&quot;
$pingstatusref[11009] = \&quot;Packet Too Big\&quot;
$pingstatusref[11010] = \&quot;Request Timed Out\&quot;
$pingstatusref[11011] = \&quot;Bad Request\&quot;
$pingstatusref[11012] = \&quot;Bad Route\&quot;
$pingstatusref[11013] = \&quot;TimeToLive Expired Transit\&quot;
$pingstatusref[11014] = \&quot;TimeToLive Expired Reassembly\&quot;
$pingstatusref[11015] = \&quot;Parameter Problem\&quot;
$pingstatusref[11016] = \&quot;Source Quench\&quot;
$pingstatusref[11017] = \&quot;Option Too Big\&quot;
$pingstatusref[11018] = \&quot;Bad Destination\&quot;
$pingstatusref[11032] = \&quot;Negotiating IPSEC\&quot;
$pingstatusref[11050] = \&quot;General Failure\&quot;


# Requêle WQL pour le ping
$ping = \&quot;select * from win32_pingstatus where address = '\&quot; + $RemoteHost + \&quot;'\&quot;

# Récupération du résultat du ping
$pingstatus = Get-WmiObject -Query $ping

# La correspondance entre $pingstatus.StatusCode et le tableau $pingstatusref
$statustext = $pingstatusref[[int]$pingstatus.StatusCode]

# La variable pingstatus.Address est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
[string]$Address = $pingstatus.Address

# Le temps de la requête
[string]$ResponseTime = $pingstatus.ResponseTime

# La variable $statustext est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
[string]$statutIP = $statustext

}

Test-Connexion -RemoteHost $IPtextBox


switch ($IPtextBox)
{
{($pingstatus.StatusCode -eq \&quot;0\&quot;«»)}{Write-Host \&quot;Ping $IPtextBox =&gt; OK en $ResponseTime ms\&quot;}
Default {break }

}

[/code:1]

A la première exécution du code =&gt; OK
Je change l'IP renseigné dans la variable $IPtextBox
Et la BadAbOuM en affichant la variable $ping je remarque qu'il garde la valeur de l'IP contenu dans $RemoteHost lors dans sa première exécution.

Le problème ne se poserait-il par l'utilisation de la fonction et du passage du paramètre $RemoteHost à la requête WQL de $ping :blink: ?

Merci pour les tutos :laugh:

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

Plus d'informations
il y a 11 ans 9 mois #17578 par callac
Bonjour Laurent,

J'ai parcouru le document les fonctions et scripts avancées sous powershell v2. J'ai effectué de mineures modifications ayant mieux compris le fonctionnement des paramètres ;)

[code:1]
# La variable $IPtextBox contiendra l'IP renseignée
$IPtextBox = \&quot;10.12.142.9\&quot;


function Test-Connexion
{
param([Parameter(Mandatory=$True)]
[string]$RemoteHost = \&quot;HostnameOrIPAddress\&quot;
)

# Rableau de correspondance entre les valeurs de retour et leur signification :
# (source: msdn2.microsoft.com/fr-fr/library/aa394350.aspx)
$pingstatusref = @{ }
$pingstatusref[0] = \&quot;Success\&quot;
$pingstatusref[11001] = \&quot;Buffer Too Small\&quot;
$pingstatusref[11002] = \&quot;Destination Net Unreachable\&quot;
$pingstatusref[11003] = \&quot;Destination Host Unreachable\&quot;
$pingstatusref[11004] = \&quot;Destination Protocol Unreachable\&quot;
$pingstatusref[11005] = \&quot;Destination Port Unreachable\&quot;
$pingstatusref[11006] = \&quot;No Resources\&quot;
$pingstatusref[11007] = \&quot;Bad Option\&quot;
$pingstatusref[11008] = \&quot;Hardware Error\&quot;
$pingstatusref[11009] = \&quot;Packet Too Big\&quot;
$pingstatusref[11010] = \&quot;Request Timed Out\&quot;
$pingstatusref[11011] = \&quot;Bad Request\&quot;
$pingstatusref[11012] = \&quot;Bad Route\&quot;
$pingstatusref[11013] = \&quot;TimeToLive Expired Transit\&quot;
$pingstatusref[11014] = \&quot;TimeToLive Expired Reassembly\&quot;
$pingstatusref[11015] = \&quot;Parameter Problem\&quot;
$pingstatusref[11016] = \&quot;Source Quench\&quot;
$pingstatusref[11017] = \&quot;Option Too Big\&quot;
$pingstatusref[11018] = \&quot;Bad Destination\&quot;
$pingstatusref[11032] = \&quot;Negotiating IPSEC\&quot;
$pingstatusref[11050] = \&quot;General Failure\&quot;


# Requêle WQL pour le ping
$ping = \&quot;select * from win32_pingstatus where address = '\&quot; + $RemoteHost + \&quot;'\&quot;

# Récupération du résultat du ping
$pingstatus = Get-WmiObject -Query $ping

# La correspondance entre $pingstatus.StatusCode et le tableau $pingstatusref
$statustext = $pingstatusref[[int]$pingstatus.StatusCode]

# La variable pingstatus.Address est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
[string]$Address = $pingstatus.Address

# Le temps de la requête
[string]$ResponseTime = $pingstatus.ResponseTime

# La variable $statustext est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
[string]$statutIP = $statustext

}

Test-Connexion -RemoteHost $IPtextBox


switch ($IPtextBox)
{
{($pingstatus.StatusCode -eq \&quot;0\&quot;«»)}{Write-Host \&quot;Ping $IPtextBox =&gt; OK en $ResponseTime ms\&quot;}
Default {break }

}

[/code:1]

A la première exécution du code =&gt; OK
Je change l'IP renseigné dans la variable $IPtextBox
Et la BadAbOuM en affichant la variable $ping je remarque qu'il garde la valeur de l'IP contenu dans $RemoteHost lors dans sa première exécution.

Le problème ne se poserait-il par l'utilisation de la fonction et du passage du paramètre $RemoteHost à la requête WQL de $ping :blink: ?

Merci pour les tutos :laugh:

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

Plus d'informations
il y a 11 ans 9 mois #17580 par Laurent Dardenne
Ta fonction doit renvoyer un résultat. Sinon tu utilises des variables qui ne sont pas déclarées dans la portée de l'appelant, mais uniquement dans celle de ta fonction.

Quelque chose chose comme :
[code:1]
$Resultat=Test-Connexion -RemoteHost $IPtextBox

if ($Resultat.StatusCode -eq \&quot;0\&quot;«»)
{Write-Host \&quot;Ping $IPtextBox =&gt; OK en $($Resultat.ResponseTime) ms\&quot;}
else
{Write-Error \&quot;Ping $IPtextBox =&gt; NOK \&quot;}
[/code:1]

Tutoriels PowerShell

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

Plus d'informations
il y a 11 ans 9 mois #17590 par callac
Mon problème c'était bien par rapport aux portées de mes variables.
Tu me dis si je me trompe :
Les variables en dehors de ma fonction comme $$IPtextBox est une variable globale. Dans ma fonction les variables ont toutes une portée local. Les variables de ma fonction pouvaient lire l'information de la variable globale mais ne pouvait pas la modifier. C'est pour cette raison que lorsque je rejouais mon script, les variables de ma fonction conservait la précédentes IP.

# La variable $IPtextBox contiendra l'IP renseignée
$IPtextBox = \&quot;192.168.0.254\&quot;

# Rableau de correspondance entre les valeurs de retour et leur signification :
# (source: msdn2.microsoft.com/fr-fr/library/aa394350.aspx)
$pingstatusref = @{ }
$pingstatusref[0] = \&quot;Success\&quot;
$pingstatusref[11001] = \&quot;Buffer Too Small\&quot;
$pingstatusref[11002] = \&quot;Destination Net Unreachable\&quot;
$pingstatusref[11003] = \&quot;Destination Host Unreachable\&quot;
$pingstatusref[11004] = \&quot;Destination Protocol Unreachable\&quot;
$pingstatusref[11005] = \&quot;Destination Port Unreachable\&quot;
$pingstatusref[11006] = \&quot;No Resources\&quot;
$pingstatusref[11007] = \&quot;Bad Option\&quot;
$pingstatusref[11008] = \&quot;Hardware Error\&quot;
$pingstatusref[11009] = \&quot;Packet Too Big\&quot;
$pingstatusref[11010] = \&quot;Request Timed Out\&quot;
$pingstatusref[11011] = \&quot;Bad Request\&quot;
$pingstatusref[11012] = \&quot;Bad Route\&quot;
$pingstatusref[11013] = \&quot;TimeToLive Expired Transit\&quot;
$pingstatusref[11014] = \&quot;TimeToLive Expired Reassembly\&quot;
$pingstatusref[11015] = \&quot;Parameter Problem\&quot;
$pingstatusref[11016] = \&quot;Source Quench\&quot;
$pingstatusref[11017] = \&quot;Option Too Big\&quot;
$pingstatusref[11018] = \&quot;Bad Destination\&quot;
$pingstatusref[11032] = \&quot;Negotiating IPSEC\&quot;
$pingstatusref[11050] = \&quot;General Failure\&quot;



function test-connexion
{
param (
[Parameter(Mandatory=$True)]
[String]$ComputerName = \&quot;HostorIpAddress\&quot;
)

# Requêle WQL pour le ping
$script:ping = \&quot;select * from win32_pingstatus where address = '\&quot; + $ComputerName + \&quot;'\&quot;

# Récupération du résultat du ping
$script:pingstatus = Get-WmiObject -Query $ping

# La correspondance entre $pingstatus.StatusCode et le tableau $pingstatusref
$script:statustext = $pingstatusref[[int]$pingstatus.StatusCode]

# Le temps de la requête
$script:ResponseTime = $pingstatus.ResponseTime

# La variable $statustext est typé en string dans une autre variable pour faciliter la syntaxe lors de l'affichage en sortie standard
$script:statutIP = $statustext

}

Test-Connexion -ComputerName $IPtextBox


switch ($ComputerName)
{
{($pingstatus.StatusCode -eq \&quot;0\&quot;)}{ Write-Host \&quot;Ping $IPtextBox =&gt; OK en $ResponseTime ms statut : $statutIP\&quot; }
{($pingstatus.StatusCode -ne \&quot;0\&quot;)}{ Write-Host \&quot;Ping $IPtextBox =&gt; KO \&quot; }
Default {break}
}


Comme ça, c'est mieux :laugh: !

L'analyse est-elle correct ?

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

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