AutoIt et Powershell grâce au Framework CLR

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jpascal
Niveau 6
Niveau 6
Messages : 226
Enregistré le : jeu. 16 oct. 2008 16:21
Status : Hors ligne

AutoIt et Powershell grâce au Framework CLR

#1

Message par jpascal »

Bonjour,

Je pense que peu d'entre vous le savent mais il est désormais possible d'utiliser les librairires .NET dans nos scripts AutoIt.
L'UDF CLR est en développement mais fonctionnel.

Je ne souhaite l’utiliser pour l'instant que pour remplacer l’utilisation de powershell.exe
Cela permet également d'améliorer la vitesse d'exécution, de ne pas avoir à relancer une session powershell à chaque fois et surtout de pouvoir conserver les connexions et valeurs de variables.

En anglais : https://audministrator.wordpress.com/20 ... framework/
Le sujet sur le forum officiel : https://www.autoitscript.com/forum/topi ... -framework

Pour l'instant j'arrive à lancer une commande de base, la stocker dans une variable que je peux récupérer plus tard.

Petit problème, lorsque j'utilise la sortie console ($PSOUT_CONSOLE), si la sortie est nulle, le fichier de sortie qui me sert à lire la valeur de sortie est nulle. Et pour je ne sais quelle raison, il ne peut être supprimé.
Vous pouvez tester en supprimant le paramètre $PSOUT_NULL de mes commandes Run_PSHost()

Gros problème, je crois comprendre que l'on peut utiliser les modules installés dans Powershell. Mais cela ne fonctionne pas.
J'ai testé avec les modules VMware.VimAutomation.Core et VMware.VimAutomation.HorizonView
Je souhaiterais en effet, pouvoir établir une connexion à un serveur VI ou Horizon et pouvoir réutiliser cette connexion plus tard dans mon script.
Si l'un d'entre vous a réussi, je serais très heureux d'avoir son aide. :)

Voici le script que j'ai créé et qui devrait me servir dans mes futurs développements :
#Region Wrapper
#AutoIt3Wrapper_UseX64=n
;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
;~ #Autoit3Wrapper_Testing=y
;~ #AutoIt3Wrapper_Run_Debug_Mode=
#EndRegion Wrapper

#Region Includes
#include <CLR.au3>
#include <File.au3>
#include <Misc.au3>
#EndRegion Includes

#Region Variables
Global Const $g_sTitleApp = ''

Global $g_pObjectPS = 0

Global Const $PSOUT_CONSOLE = 0
Global Const $PSOUT_GRID = 1
Global Const $PSOUT_PRINTER = 2
Global Const $PSOUT_FILE = 3
Global Const $PSOUT_NULL = 4
#EndRegion Variables

;#RequireAdmin

Test()

Func Test()
   Local $sRet = ''

   Init_PSHost()

   Run_PSHost('$out = $PSVersionTable', $PSOUT_NULL)
   Run_PSHost('$out += "`rTexte supplémentaire"',$PSOUT_NULL)
   Run_PSHost('$out')

   ConsoleWrite('END PROCESS' & @CRLF)
   Sleep(2000)
EndFunc   ;==>Test

Func Init_PSHost()
   Local $oAssembly = _CLR_LoadLibrary("System.Management.Automation")
   ConsoleWrite("!$oAssembly: " & IsObj($oAssembly) & @CRLF)

   ; Create Object
   Local $pAssemblyType = 0
   $oAssembly.GetType_2("System.Management.Automation.PowerShell", $pAssemblyType)
   ConsoleWrite("$pAssemblyType = " & Ptr($pAssemblyType) & @CRLF)

   Local $oActivatorType = ObjCreateInterface($pAssemblyType, $sIID_IType, $sTag_IType)
   ConsoleWrite("IsObj( $oAssemblyType ) = " & IsObj($oActivatorType) & @TAB & @CRLF)

   ; Create Object
   $oActivatorType.InvokeMember_3("Create", 0x158, 0, 0, 0, $g_pObjectPS)
   ConsoleWrite("IsObject: " & IsObj($g_pObjectPS) & @TAB & "$pObject: " & ObjName($g_pObjectPS) & @CRLF)
EndFunc   ;==>Init_PSHost

Func Run_PSHost($PSScript, $iOutput = $PSOUT_CONSOLE, $sFileOutput = '')
   Local $objAsync
   Local $sOutput = ''

   If $sFileOutput = '' Then $sFileOutput = _TempFile()

   ; Script
   $g_pObjectPS.AddScript($PSScript)
   ConsoleWrite('Commande : ' & $PSScript & @CRLF)

   ; Output
   Switch $iOutput
      Case $PSOUT_CONSOLE
;~              $g_pObjectPS.AddCommand("Out-Host")
;~              $g_pObjectPS.AddCommand("Out-String")
;~              $g_pObjectPS.AddCommand("Write-Host")
;~                 Msgbox(16,"Error","This Output method '0' is not working yet :-( " & @CRLF & "choose another one")
;~                 Exit
         $g_pObjectPS.AddCommand("Out-File")
         ConsoleWrite('File : ' & $sFileOutput & @CRLF)
         $g_pObjectPS.AddArgument($sFileOutput)

      Case $PSOUT_GRID
         $g_pObjectPS.AddCommand("Out-GridView")

      Case $PSOUT_PRINTER
         $g_pObjectPS.AddCommand("Out-Printer")

      Case $PSOUT_FILE
         $g_pObjectPS.AddCommand("Out-File")
         ConsoleWrite('File : ' & $sFileOutput & @CRLF)
         $g_pObjectPS.AddArgument($sFileOutput)

      Case $PSOUT_NULL
         $g_pObjectPS.AddCommand("Out-Null")

      Case Else
         MsgBox($MB_SYSTEMMODAL + $MB_ICONERROR, "PSHost", "Wrong Output Choice ?")
         Return SetError(1)
   EndSwitch

   $objAsync = $g_pObjectPS.BeginInvoke()
   ConsoleWrite("$objAsync " & IsObj($objAsync & @TAB & "$pObject: " & ObjName($objAsync)) & @CRLF)

   While $objAsync.IsCompleted = False
;~          ConsoleWrite($objAsync.IsCompleted & @CRLF)
      ContinueLoop
   WEnd

   Local $objPsCollection = $g_pObjectPS.EndInvoke($objAsync)

   Switch $iOutput
      Case $PSOUT_CONSOLE
;~          ConsoleWrite( $objPsCollection & @CRLF)
;~          MsgBox(16,"PSHost","Output To Console is not working yet :-( ?" & @CRLF &  @CRLF & " Best make a different OUTPUT option.")
         Sleep(100)
         $sOutput = FileRead($sFileOutput)
         Sleep(100)
         ConsoleWrite($sOutput & @CRLF)
         FileDelete($sFileOutput)
         Return $sOutput

      Case $PSOUT_GRID
         Sleep(10000)
;~          WinWaitClose("")

      Case $PSOUT_FILE
         Return $sFileOutput
   EndSwitch
EndFunc   ;==>Run_PSHost


Et pour la petite histoire, j'avais trouvé un ActiveX (développé par SAPIEN) qui aurait pu m'aider dans ma tâche mais impossible d'enregistrer la dll. :?
Script : https://audministrator.wordpress.com/20 ... om-object/
Téléchargement : http://www.sapien.com/downloads# (Free Components)
AutoIt 3.3.16.1 - AutoIt3Wrapper 21.316.1639.1
Répondre