Question
[Fonction] Verifier présence d'un processus
- Robin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Je tiens à préciser d'avance que j'me suis triturer le cerveau pour comprendre ce qui n'allez pas dans mon script.
Voila la dite fonction :
Les variables sont définies dans le fichier pour faciliter l'utilisation, au même titre que l'execution de la fonction et de l'affichage de ce dernier.
[code:1]#* FileName: FunctionTemplate.txt
#*=============================================================================
#* FUNCTION LISTINGS
#*=============================================================================
#* Function: GetProcess
#* Created: 20/03/2008
#* Author: Robin Aleman
#* Arguments: /
#*=============================================================================
#* Purpose: Permet de verifier l'existance d'un processus sur un ordinateur distant.
#* Renseigner les variables $computer (Nom de l'ordinateur cible) et $process nom du processus (ne pas metre l'extention *.exe)
#* Si processus en ligne : statusprocess = 1 / sinon statutsprocess = 0
#*
#*
#*=============================================================================
#* Variables
#* $computer
#* $process
#*
#*
#*
$computer = \"d0036\"
$process = \"explorer\"
function GetProcess {
$pstatut = [System.Diagnostics.Process]::GetProcesses($computer) | Select-Object -Property Name | Where-Object -FilterScript { $_.Name -eq $process}
$pstatut
if ($pstatut.Name -eq $process )
{ $petat = \"1\" } else
{ $petat = \"0\" }
}
GetProcess
Write-Host $petat
if ($petat -eq 1)
{ Write-Host \"La session est ouverte\" } else
{ Write-Host \"La session est fermé\" }
[/code:1]
L'objectif est assez explicite je pense; le but est de savoir si une session est ouverte sur le poste distant.
Mais la fonction a pour seul objectif de signifier la présence d'un processus ou non.
Le problème : Si je modifie le nom de machine, le script s'exécute mal, il ne met pas a jour la variable $pstatut
Je ne sais pas si cela viens de l'éditeur (PowerShellPlus) mais j'ai eu le même symptôme avec la console Powershell et le même code (code tapé dans la console)
Je voudrais savoir si j'ai fait une erreur dans la syntaxe pour la création d'une fonction, ou si c'est le fonctionnement même de Powershell qui donne se résultat.
En vous remerciant,
Crazysky
Robin Aleman,
Apprenti au CHU-Montpellier
Débutant PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
Crazysky écrit:
Non mais j'aurais une autre approche basée notamment sur l'usage de boolean :Je voudrais savoir si j'ai fait une erreur dans la syntaxe pour la création d'une fonction
[code:1]function GetProcess ([string] $OrdinateurCible, [string] $NomProcessus)
{
Return ([System.Diagnostics.Process]::GetProcesses($OrdinateurCible) | Where-Object {$_.Name -eq $NomProcessus}) -ne $null
}
if (GetProcess(\"d0036\",\"Explorer\"«»))
{Write-Host \"La session est ouverte\" }
else
{ Write-Host \"La session est fermé\" }
[/code:1]
Ce qui t'intéresse c'est si le process existe ou pas, on peut donc simplifier le pipe. De plus l'usage de la méthode GetProcessesByName semble préférable, consomme moins de ressources réseau.
Pour le pb d'exécution sur une machine distante il faut dans ce cas afficher les résultats intermédiaires
Et contrôler avec WMI les même données, si c'est possible.
Enfin il y a sûrement d'autres pistes...
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Robin Lemesle
- Hors Ligne
- Modérateur
- Messages : 260
- Remerciements reçus 0
Le problème : Si je modifie le nom de machine, le script s'exécute mal, il ne met pas a jour la variable $pstatut
Je ne sais pas si cela viens de l'éditeur (PowerShellPlus) mais j'ai eu le même symptôme avec la console Powershell et le même code (code tapé dans la console)
Comme dit BatchMan, il faut afficher les résultats intermédiaires. Car je ne comprends pas pourquoi ne marche pas. Tu as bien les droits ?
Exécuter seulement la requête WMI sur plusieurs postes à la suite et tiens nous au courant
Robin MVP PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Robin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Donc j'ai trouvé le \"hic\". Normalement si je tape
>GetProcess
Il est censé exécuter la fonction.
Jusque là pas de problème.
Cependant, si je re-exécute la fonction dans la même Instance PowerShell, il ne re-exécute pas le contenu de la fonction.
si je veux dans la même instance avoir des informations à jour, je dois executer \"$pstatut = [System.Diagnostics.Process]::GetProcesses($computer) | Select-Object -Property Name | Where-Object -FilterScript { $_.Name -eq $process}\" pour que toute la machine se mette à jour.
Donc si vous avez une idée de pourquoi PS me fait un truc pareil :-/
>> Pour information, oui j'ai les droits nécessaire. Ensuite si j'exécute juste la commande WMI il n'y a aucun problème. Le soucis ce situe au niveau de l'outil \"function\" :-/<br><br>Message édité par: Crazysky, à: 7/04/08 14:50
Robin Aleman,
Apprenti au CHU-Montpellier
Débutant PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Robin
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 7
- Remerciements reçus 0
Je ne connais pas du tout ce système de boolean.
Par contre ton script ne récupère pas les infos, ci dessous le message de debug :
[code:1]DEBUG: 1+ . 'c:.ps1'
DEBUG: ! CALL script 'Untitled6.ps1'
DEBUG: 1+ function GetProcess ([string] $OrdinateurCible, [string] $NomProcessus)
DEBUG: 6+ if (GetProcess(\"d0036\",\"Explorer\"«»))
DEBUG: ! CALL function 'GetProcess' (defined in file 'C:.ps1')
DEBUG: 3+ return ([System.Diagnostics.Process]::GetProcesses($OrdinateurCible) | Where-Object $_.Name -eq $NomProcessus) -ne $null
DEBUG: ! CALL method 'static System.Diagnostics.Process[] GetProcesses(String machineName)'
DEBUG: 2+ if ($ErrorView -ne \"CategoryView\"«»)
DEBUG: 3+ $myinv = $_.InvocationInfo
DEBUG: ! SET $myinv = 'System.Management.Automation.InvocationInfo'.
DEBUG: 4+ switch -regex ($myinv.MyCommand.CommandType)
DEBUG: 24+ if ($myinv.MyCommand.Name)
DEBUG: 2+ if ($_.InvocationInfo)
DEBUG: 3+ $posmsg = $_.InvocationInfo.PositionMessage
DEBUG: ! SET $posmsg = 'Au niveau de C:.ps1 : 3 Caractère : 52...'.
DEBUG: 7+ if ($ErrorView -eq \"CategoryView\"«»)
DEBUG: 11+ $_.Exception.Message + $posmsg
Exception lors de l'appel de « GetProcesses » avec « 1 » argument(s) : « Couldn't connect to remote mach
ine. »
Au niveau de C:.ps1 : 3 Caractère : 52
+ return ([System.Diagnostics.Process]::GetProcesses( <<<< $OrdinateurCible) | Where-Object $_.Name -e
q $NomProcessus
DEBUG: 9+ Write-Host \"La session est fermé\"
La session est fermé[/code:1]
Robin Aleman,
Apprenti au CHU-Montpellier
Débutant PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
oui j'ai encore un soucis avec la syntaxe des appels de fonction
[code:1]
if (GetProcess \"d0036\" \"Explorer\"«»)
{Write-Host \"La session est ouverte\" }
else
{ Write-Host \"La session est fermée\" }
[/code:1]
Quant à ce pb je n'ai pas compris :
Tu parles de portée ??Il est censé exécuter la fonction.
Jusque là pas de problème.
Cependant, si je re-exécute la fonction dans la même Instance PowerShell, il ne re-exécute pas le contenu de la fonction.
Vérifie dans le provider de functions si elle est bien présente.
[code:1]Dir function:getpro*[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- [Fonction] Verifier présence d'un processus