IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Débutant Powershell - Cherche à exécuter un programme externe et gérer l'erreur [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut Débutant Powershell - Cherche à exécuter un programme externe et gérer l'erreur
    Bonjour

    J'ai développé en shell (bash) un script qui manipule les machines virtuelles de VirtualBox. Il utilise pour ça la commande dédiée "vboxmanage" qui est un exécutable à part entière (et qui permet toutes les actions voulues pourvu qu'on lui passe les bons mots-clefs). Donc j'appelle la commande, je traite ce qu'elle affiche etc. En bash je m'en sors très bien.

    Je cherche maintenant à adapter mon script en powershell ce qui me donne l'occasion de me mettre à ce langage. Sauf que je n'arrive pas à bien démarrer.

    Pour commencer, je cherche juste à récupérer le résultat renvoyé par vboxmanage. Là ça va => $data=vboxmanage showvminfo xxx ("xxx" étant le nom de ma machine virtuelle). Mais ensuite (comme je l'ai fait en bash), je veux traiter le cas où "xxx" n'existe pas. Dans ce cas, la commande vboxmanage répond ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VBoxManage.exe: error: Could not find a registered machine named 'xxx'
    VBoxManage.exe: error: Details: code VBOX_E_OBJECT_NOT_FOUND (0x80bb0001), component VirtualBoxWrap, interface IVirtualBox, callee IUnknown
    VBoxManage.exe: error: Context: "FindMachine(Bstr(VMNameOrUuid).raw(), machine.asOutParam())" at line 3139 of file VBoxManageInfo.cpp
    ... et retourne un code d'erreur qu'en bash je sais intercepter.

    De son côté, Windows détecte aussi cela comme une erreur puisque si on demande vboxmanage showvminfo xxx 2>err.txt le contenu va dans le fichier "err.txt". Mais même en étant détecté comme erreur, je n'arrive pas à l'intercepter.

    Voici ce que j'ai tenté en powershell
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Script Powershell
     
    # Fonction qui récupère le uuid d'une machine
    function getUUID {
    	Write-Host "args=" $args[0]
    	try {
    		$data=vboxmanage showvminfo $args[0]
    		Write-Host $data
    	}
    	catch {
    		Write-Host 'Erreur' $_.Exception.Message
    	}
    }
     
    foreach ($x in $args) {
    	getUUID $x
    }

    Je pense qu'appeler directement la commande "vboxmanage" n'est pas une bonne idée. Par exemple pour lire un fichier, pas besoin d'appeler la commande MsDos type fichier, powershell possède un cmdlet "get-content" qui fait le job. Je me dis que l'équivalent doit exister pour traiter une commande (style les pipes) mais je ne trouve pas.

    Un petit coup de main pour démarrer s'il vous plait?

    Merci de votre attention.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Bonjour, voici quelques façons de le faire

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    dir err 2>$null
    if (! $?)
    {
        Write-Host "Error 1"
    }
     
    $Error.Clear()
    dir err 2>$null
    if ($Error)
    {
        Write-Host "Error 2"
    }
     
     
    $ErrorActionPreference = 'Stop'
    try
    {
        dir err 2>$null
    }
    catch
    {
        Write-Host "Error 3"
    }
    finally
    {
        $ErrorActionPreference = "Continue"
    }

    plus d'info sur $? : https://learn.microsoft.com/fr-fr/po...-7.3#section-1

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ericlm128 Voir le message
    Bonjour, voici quelques façons de le faire

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dir err 2>$null
    if (! $?)
    {
        Write-Host "Error 1"
    }
    Super sympa. J'ai testé les trois et (évidemment) toutes fonctionnent. Je n'avais pas perçu le rôle de $ErrorActionPreference = 'Stop'.

    J'aime bien la première (ressemblant à bash). Il y a moyen d'être plus explicite que if (! $?)? Perso j'aime bien ce qui est explicite. J'ai tenté if ($? == False), if ($? == $FALSE), if ($? != 0) mais rien. Ca parle de System.Management.Automation.InvocationInfo (probablement l'objet de $?). Enfin bon je pense que ça viendra avec l'expérience.

    Merci encore.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    dir err 2>$null
    if ($? -eq $false)
    {
        Write-Host "Error 4"
    }

    Comparison Operators : https://learn.microsoft.com/en-us/po...ison-operators

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 836
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 836
    Billets dans le blog
    1
    Par défaut
    Super, je suis parti

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # Script Powershell
     
    # Fonction qui récupère le uuid d'une machine
    function getUUID {
    	$data=vboxmanage showvminfo $args[0] 2>$null; $status=$?
    	if ($status -ne $true) { return $null }
     
    	foreach ($ligne in $data) {
    		if ($ligne.startswith("UUID")) {
    			return $ligne.split(":")[1].trim()
    		}
    	}
     
    	return $null;		# Sécurité
    }
     
    #foreach ($x in $args) {
    foreach ($vm in ("toto", "Xubuntu64")) {
    	$uuid=getUUID $vm
    	if ($uuid -eq $null) {
    		Write-Host "Machine [$vm] inconnue ($uuid) - Abort"
    		continue
    	}
    	Write-Host "Machine [$vm] ($uuid) en cours..."
    }
    Je sais que c'est très bébé mais ça viendra avec l'expérience

    Merci encore
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Pas de problème on a tous débuté un jour

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Prob Exécuter un programme externe "Calc"
    Par badboykiller dans le forum VB.NET
    Réponses: 2
    Dernier message: 01/03/2010, 17h36
  2. Réponses: 3
    Dernier message: 07/08/2008, 10h00
  3. [PHP-JS] Exécuter un programme externe
    Par MagicManu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/05/2008, 08h35
  4. Exécuter un programme externe
    Par nourbane dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2006, 18h52
  5. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo