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...
... et retourne un code d'erreur qu'en bash je sais intercepter.
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
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.
Partager