AutoIt et Powershell grâce au Framework CLR

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

AutoIt et Powershell grâce au Framework CLR

#1

Message par jpascal » lun. 25 nov. 2019 12:34

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.15.1 / SciTE 4.1.0 / Windows 7 & 10 x64

Répondre