Skip navigation.

digital-nation

Blog-note d'un informaticien procrastinate...

Posts tagged with "autoit"

Installation silencieuse d’une application

, , , ...

Il arrive parfois qu’on doivent installer des logiciels sans interactions humaines… Cette méthode d’installation s’appelle « silent » ou « stealth ».

Pour ce faire, nous utilisons un fichier MSI… Nous savons que le MSI utilise le MSIExec… Logiciel de Microsoft pour installer ces dits logiciels est appelé « Microsoft Installer » (plus sympa aussi). Nous savons aussi ses paramètres et sa syntaxe :



msiexec /Option <Required Parameter> [Optional Parameter]

Install Options
</package | /i> <Product.msi>
Installs or configures a product
/a <Product.msi>
Administrative install - Installs a product on the network
/j<u|m> <Product.msi> [/t <Transform List>] [/g <Language ID>]
Advertises a product - m to all users, u to current user
</uninstall | /x> <Product.msi | ProductCode>
Uninstalls the product
Display Options
/quiet
Quiet mode, no user interaction
/passive
Unattended mode - progress bar only
/q[n|b|r|f]
Sets user interface level
n - No UI
b - Basic UI
r - Reduced UI
f - Full UI (default)
/help
Help information
Restart Options
/norestart
Do not restart after the installation is complete
/promptrestart
Prompts the user for restart if necessary
/forcerestart
Always restart the computer after installation
Logging Options
/l[i|w|e|a|r|u|c|m|o|p|v|x|+|!|*] <LogFile>
i - Status messages
w - Nonfatal warnings
e - All error messages
a - Start up of actions
r - Action-specific records
u - User requests
c - Initial UI parameters
m - Out-of-memory or fatal exit information
o - Out-of-disk-space messages
p - Terminal properties
v - Verbose output
x - Extra debugging information
+ - Append to existing log file
! - Flush each line to the log
* - Log all information, except for v and x options
/log <LogFile>
Equivalent of /l* <LogFile>
Update Options
/update <Update1.msp>[;Update2.msp]
Applies update(s)
/uninstall <PatchCodeGuid>[;Update2.msp] /package <Product.msi | ProductCode>
Remove update(s) for a product
Repair Options
/f[p|e|c|m|s|o|d|a|u|v] <Product.msi | ProductCode>
Repairs a product
p - only if file is missing
o - if file is missing or an older version is installed (default)
e - if file is missing or an equal or older version is installed
d - if file is missing or a different version is installed
c - if file is missing or checksum does not match the calculated value
a - forces all files to be reinstalled
u - all required user-specific registry entries (default)
m - all required computer-specific registry entries (default)
s - all existing shortcuts (default)
v - runs from source and recaches local package
Setting Public Properties
[PROPERTY=PropertyValue]


En règle générale nous avons donc la ligne de commande suivante
MSIEXEC.EXE /i INSTALL.MSI /qn

Cependant, et bien souvent, les utilisateurs ne sont pas adminstrateur de leurs postes. Et les applications se font de plus en plus lourde pour les distribuer à travers le réseau via des GPO.
Par là même il faut donc utiliser des droits d’un profil administrateur… Cela peut se faire de deux manières :
passage de paramètres à un fichier BATCH, les arguments sont stockés par exemple dans un exécutable (non visible à l’utilisateur donc) et transmis par %1 et %2 dans le BATCH
utilisation de la commande RUNASWAIT d’AutoIT avec un chargement de profil :
RunAsWait($s_utilisateur, $s_reseau, $s_motdepasse, 4, "MSIEXEC.EXE /i INSTALL.MSI /qn", @ScriptDir, @SW_Hide)

L’installation continuera dès la fin de la commande. Il est tout aussi utile alors d’utiliser la commande ProgressSet afin de faire patienter l’utilisateur (il est toujours recommandé de ne pas faire d’autres actions lors d’une installation).

Dans la continuité, il faut changer les droits du dossier… Simplement avec script en MS-DOS.

Simple et efficace. Mais surtout convivial pour l’utilisateur : il ne se préoccupe pas de l’installation, tout se fait « automatiquement » avec le SI derrière :smile:

Utilisation du ProgressSet

, , , ...

Lorsqu’on déploie un logiciel, en mode silencieux par exemple, il est toujours bon d’indiquer où cette installation en est.

Bien entendu, nous pourrions créer une interface graphique (à l’aide de GUICreate), dans laquelle nous insérerions un GUICtrlCreateProgress… Mais pourquoi faire complexe lorsqu’on peut faire simple ?

Je préconise alors l’utilisation d’un Progress() que l’on peut personnaliser.
Cela se fait simplement par la commande suivante :
ProgressOn("titre du progress", "texte principal", "texte secondaire", position, position, option)


Par la suite, il faut faire « afficher » cette progression. Malheureusement il n’y a pas d’autres secrets que de faire « dormir » le script, le faire patienter. Encore faut-il trouver le temps correct pour que l’utilisateur puisse s’intéresser à cette progression, sans s’endormir ou penser que celle-ci est bloquée.

Je préconise donc une utilisation d’un sleep() variant de 200ms (en dessous c’est inutile, cela parait être « un flash ») à 4000ms (4s) (au dessus c’est un peu énorme, … Et l’utilisateur ne comprendra pas le but).

En code cela donne ceci :
ProgressOn("Deploiement", "Initialisation de l'installation", "Vérification des prérequis", -1, -1, 16); Barre de progression
WinActivate("Deploiement") ; Activation barre de progression
Sleep(500) ; je dors pendant ½ seconde


Lorsque cette barre est initialisée, il faut bien entendu lui donner à manger selon les actions faites.
Certes c’est fastidieux mais c’est nécessaire afin d’avoir un beau déploiement.
Cette mise à jour se fait par ProgressSet()
La syntaxe est aussi facile que le ProgressOn() :
ProgressSet(pourcentage, "mon texte secondaire", "mon texte principal")

Nous aurons donc selon les actions une succession de mise à jour :
ProgressOn( … )
WinActivate( …)
Sleep( … )
ProgressSet( … )
Sleep( … )
 MON_ACTION_A_FAIRE
ProgressSet( … )
Sleep( … )
MON_AUTRE_ACTION_A_FAIRE
ProgressSet( … )
; etc etc


Le pourcentage évoluera selon les actions à faire… Ou ce qu’il faut faire dans l’action (pourcentage de l’action).
Mais par la suite, il faut « tuer » ce Progress() et ça c’est via ProgressOff() (aucun argument nécessaire).

Oui mais… Et si on a des fonctions de vérifications me direz-vous ?
Bien souvent ces fonctions font un renvoi d’erreur. Et bien nous complèterons donc dans la fonction le Progress() !

Func _maFonction($arguments)
$maconditiond_erreur = 1
If $arguments = $maconditiond_erreur Then
ProgressSet(99,"Erreur trouvée", "ERREUR : " & @ScriptLineNumber)
Sleep(3000)
ProgressOff()
MsgBox(0+16, "ERREUR", "Une erreur est rencontrée, sortie du déploiement")
EXIT
EndIf
EndFunc


Simple et esthétique. Et surtout destiné à ne pas s’ennuyer dans les GUI !

Passerelle par défaut

, , ,

Il est parfois utile d'avoir la passerelle par défaut, que ce soit pour une installation logicielle, matérielle, ou tout autre objectif.

Mais comment déterminer celle-ci ?
Nous pouvons bien entendu le faire en VBS, mais aussi en AutoIt.

Exemple :
' VBS 
strComputer = "." 'pour l ordinateur
Set WshShell = WScript.CreateObject("WScript.Shell")
' Set strComputer = WshShell.Environment("VOLATILE").Item("CLIENTNAME") 'pour environnement virtuel

Set objWMIService = GetObject("winmgmts:" _
   & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colAdapters = objWMIService.ExecQuery _
   ("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")

For Each objAdapter in colAdapters
  If Not IsNull(objAdapter.DefaultIPGateway) Then
     For i = 0 To UBound(objAdapter.DefaultIPGateway)
        WScript.Echo "  Default gateway: " & objAdapter.DefaultIPGateway(i)
                If objAdapter.DefaultIPGateway(i) = "192.168.1.6" Then
                       WScript.Echo "Votre Gateway : " & DefaultIPGateway(i)
                End If
     Next
  End If
Next

Cela fonctionne à merveille. L'inconvéniant avec le VBS c'est les structures conditionnelles, et puis pourquoi le faire en VBS alors qu'on peux facilement le faire en AutoIt ?

Exemple :
Func _get_default_gateway()
    $output = _get_cmd_output("netstat -rn")
    $arr = StringSplit($output, "0.0.0.0", 1)
    $arr2 = StringStripWS($arr[3], 1)
    $arr2 = StringSplit($arr2, " ")
    Return $arr2[1]
EndFunc
Func _get_cmd_output($cmd)
    $cmd_timeout = 2000
    $pid = Run($cmd,@WorkingDir,@SW_HIDE,2)
    $timer = TimerInit()
    while (ProcessExists($pid))
        sleep(50)
        If TimerDiff($timer) > $cmd_timeout Then ProcessClose($pid)
    WEnd
    $output = StdoutRead($pid)
    Return StringStripCR($output)
EndFunc

Pour avoir la valeur, une simple boite de dialogue et le tour est joué :
Dim $i
$i = _get_default_gateway()
MsgBox(0, "","Votre passerelle : " & $i)

La structure conditionnelle (si plusieurs passerelles sont possible) est faisable hors de la fonction :D

FOSDEM 2009

, , , ...

C’est la neuvième édition du FOSDEM qui se déroulera cette année et ma quatrième participation en tant que visiteur. Cette année, j’y serais, peut-être dans l’équipe de l’info-desk (reste à confirmer).

Le FOSDEM (UK), c’est à chaque fois l’événement du logiciel libre en Belgique, et un moyen pour moi de voir à quoi j’ai contribué dans celui-ci(tant par son utilisation, que sa promotion ou encore son développement !).

Cette année je suis resté dans les grands classiques :
  • VLC, le célèbre lecteur qui prend presque tous les formats ;
  • AutoIt, le langage de programmation qui remplace facilement le VBS (voir même le VB) et qui permet de faire des interfaces graphiques pour du scripting ;
  • Notepad++ qui remplace mon bloc-note ;
  • Firefox, pour mes tests internet ;
  • ZazouMiniWebServeur, le serveur web le plus léger du marché mais aussi très performant ;
  • Inno Setup (je l’avais pas utilisé depuis un bout de temps !), un installeur libre ;
  • 7zip, remplaçant Winzip et Winrar…
  • Bullzip mon imprimante virtuelle PDF ;
  • PHP, MySQL et Apache, le « parfait » pour la production web (ZMWS me servant principalement pour le test !) ;

(Je ne mets pas les liens, il suffit de les trouver dans Google ! :wink: )
Quelques outils gratuits viennent compléter tout cela.

Bien entendu j’ai une grande nouveauté mise en production : GLPI.
Le logiciel, le must, le grand des grands dans la gestion de parcs informatique et de ticketing pour le support !

AutoIt : mise à jour d'une interface graphique

, , , ...

Rare sont les fois où je répond par e-mail ou même que je répond par l'interface de mon blog à un problème de script dans AutoIt (ou même tout autre type de problème !). Toutefois ici la question était intéressant : comment mettre à jour une interface graphique ?

Je dirais simplement en utilisant la combinaison de GUICtrlSetData, GUICtrlRead, GUICtrlSetState ! Et pour pouvoir démontrer cela, pourquoi ne pas le faire :

  • Cacher un contrôle : utilisation de GUICtrlSetState :
    GUICtrlSetState($lbl_LabelInvisible, $GUI_HIDE)
    

  • Lire les données d'un contrôle : utilisation de GUICtrlRead :
    GUICtrlRead($btn_Test) = "M.A.J. Terminée"
    

  • Définir les données d'un contrôle : GUICtrlSetData :
    GUICtrlSetData($btn_Test, "Exit")
    



Pour faire un décompte, il suffit donc d'appliquer ce qui est décrit ci-dessus et de l'inclure dans une boucle :
Dim $i
$i = 5
While $i > 0
GUICtrlSetData($btn_Test, "M.A.J. dans " & $i)
$i = $i - 1
Sleep(1000)
WEnd
If $i = 0 Then 
GUICtrlSetData($btn_Test, "M.A.J. Terminée")
EndIf


Vous pouvez aussi définir un style à un contrôle en utilisant l'apendice des styles étendus (exemple une couleur CUICtrlSetColor(controle,couleur)).

Le script complet :
#include <GUIConstants.au3>
#Region ### START Koda GUI section ### Form=
$fm_MonInterface = GUICreate("Mon interface", 450, 245, -1, -1)
$btn_Test = GUICtrlCreateButton("Test", 320, 195, 120, 40, 0)
GUICtrlSetCursor ($btn_Test, 0)
$gp_MAJGUI = GUICtrlCreateGroup(" Mise à jour d'un interface graphique ", 10, 30, 430, 155)
$lbl_StatusInitial = GUICtrlCreateLabel("Status initial", 25, 55, 250, 20)
$lbl_LabelInvisible = GUICtrlCreateLabel("Label apparut pour la mise à jour. Le bouton Test à un décompte", 25, 105, 350, 20)
GUICtrlSetState($lbl_LabelInvisible, $GUI_HIDE)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $btn_Test
If GUICtrlRead($btn_Test) = "M.A.J. Terminée" Then
MsgBox(0, "Information", "La mise à jour de l'interface à déjà été effectuée")
GUICtrlSetData($btn_Test, "Exit")
Else 
If GUICtrlRead($btn_Test) = "Exit" Then Exit
_majCtrl()
EndIf
EndSwitch
WEnd

Func _majCtrl()
GUICtrlSetState($lbl_LabelInvisible, $GUI_SHOW)
GUICtrlSetData($lbl_StatusInitial, "Texte mis à jour et mis en rouge")
GUICtrlSetColor($lbl_StatusInitial, 0xff0000)
Dim $i
$i = 5
While $i > 0
GUICtrlSetData($btn_Test, "M.A.J. dans " & $i)
$i = $i - 1
Sleep(1000)
WEnd
If $i = 0 Then 
GUICtrlSetData($btn_Test, "M.A.J. Terminée")
EndIf
EndFunc

AutoIt : changer l'adresse IP

, , , ...

Alors que pour une raison quelconque je ne pouvais pas utiliser le NETSH pour changer l'adresse IP dans un fichier BATCH classique, je n'ai pas trouvé d'autres manières de le faire dans AutoIT.

Mais pourquoi ne pas faire partager cette ressource ?

Alors j'ai simplement compilé les deux : un RUNWAIT et le NETSH classique.

Func _IP($centre,$pc)
GUISetState(@SW_HIDE)
SplashTextOn("Crépuscule", "Configuration en cours, veuillez patienter...", 400, 75, -1, -1)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip set address "Local Area Connection" static 192.168.' & _
$centre & '.' & $pc & ' mask=255.255.255.0 192.168.' & $centre & '.1 0', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip set dns "Local Area Connection" static 192.168.1.1 PRIMARY', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip add dns "Local Area Connection" 192.168.1.2 2', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip set wins "Local Area Connection" static 192.168.1.1', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip add wins "Local Area Conection" 192.168.1.2 2', '', @SW_HIDE)
SplashOff()
EndFunc

Func _DHCP()
GUISetState(@SW_HIDE)
SplashTextOn("Crépuscule", "Configuration en cours, veuillez patienter...", 400, 75, -1, -1)
WinActivate("Crépuscule")
RunWait('netsh.exe interface ip set address "Local Area Connection" dhcp', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe netsh interface ip set wins "Local Area Connection" dhcp', '', @SW_HIDE)
WinActivate("Crépuscule")
RunWait('netsh.exe netsh interface ip set dns "Local Area Connection" dhcp', '', @SW_HIDE)
WinActivate("Crépuscule")
SplashOff()
EndFunc


J'ai fait pour l'amusement un p'tit SPLASHTEXTON ... Vous pouvez maintenant associer ces deux fonctions...

Bien entendu vous devez modifier le RANGE IP ainsi que les DNS. Vous avez aussi la possibilité de les intégrer en tant que variable dans la fonction _IP() !

Simple, mais au moins efficace.

MS-DOS : changer les sécurités d'un dossier

, , , ...

Alors qu'au niveau professionnel je cherchais un petit utilitaire pour changer rapidement et efficacement des sécurités et permissions d'un dossier je suis tombé sur une commande MS-DOS assez utile : CACLS.
Microsoft Windows XP [version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\Groumphy>cacls
Affiche ou modifie les listes de contrôle d'accès (ACL) des fichiers

CACLS nom_de_fichier [/T] [/E] [/C] [/G util:perm] [/R util [...]]
                     [/P util:perm [...]] [/D util [...]]
   nom_de_fichier  Affiche les ACL.
   /T              Modifie les ACL des fichiers spécifiés dans le
                   répertoire en cours et tous les sous-répertoires.
   /E              Édite l'ACL au lieu de la remplacer.
   /C              Continue la modification des ACL en ignorant les erreurs.
   /G util:perm    Donne à l'utilisateur spécifié les droits d'accès.
                   Perm peut être : R  Lecture
                                    W  Écriture
                                    C  Modification (en écriture)
                                    F  Contrôle total
   /R util         Retire les droits d'accès de l'utilisateur (avec /E).
   /P util:perm    Remplace les droits d'accès de l'utilisateur spécifié.
                   Perm peut être : N  Aucun
                                    R  Lecture
                                    W  Écriture
                                    C  Modification (en écriture)
                                    F  Contrôle total
   /D util         Refuse l'accès à l'utilisateur spécifié.
Des caractères génériques peuvent être utilisés pour préciser plusieurs
fichiers dans une commande. Vous pouvez spécifier plus d'un utilisateur dans
une commande.

Abréviations :
   CI - Héritage de conteneur (Container Inherit).
        Les répertoires héritent de l'entrée de contrôle d'accès.
   OI - Héritage d'objet (Object Inherit).
        Les fichiers héritent de l'entrée de contrôle d'accès.
   IO - Héritage uniquement (Inherit Only).
        L'entrée de contrôle d'accès ne s'applique pas au fichier ou
        répertoire en cours.

C:\Documents and Settings\Groumphy>

Cette commande permet donc d'être rapide et efficace dans une modification de permissions.
CACLS C:\Windows\Temps /E /G Groumphy:F


J'attire toutefois l'attention que tout ce qui est autre utilisateur autorisé avec l'argument /E est littéralement supprimé.

De fait, il est préférable d'utiliser l'argument /T sur un utilisateur présent afin de conserver les propriétés existantes.
De ce fait, il est préférable de d'abord rajouter l'utilisateur (avec l'argument /G comme montré ci-dessus) puis de les éditer (avec /T en argument).
CACLS C:\Windows\Temps /T /G Groumphy:W
CACLS C:\Windows\Temps /T /G Groumphy:F


Bien entendu tout cela doit être exécuté en mode administrateur... Petit inconvénient toutefois la commande RUNAS qui exécute en mode administrateur (par exemple) doit avoir les mots de passe et login ; mais inscrit en clair !

Pas très drôle.
Alors il est parfois utile de constituer un petit script AutoIt permettant de donner en paramètres les mots de passe et login... Ce qui ne sera jamais affiché en clair pour l'utilisateur !
; Auteur : Groumphy 
; Licence : CC-Share-Alike 2.0 
; 2008

Dim $s_Login, $s_Mdp
$s_Login = InputBox("Nom d'utilisateur", "Quel est le nom d'utilisateur pour l'exécution du script ?")
$s_Mdp = InputBox("Mot de passe", "Quel est le mot de passe pour l'exécution du script (rappel : nom d'utilisateur = " & $s_Login)
RunWait(@ScriptDir & "nomDuScript.bat" & $s_Login & " " & $s_Mdp, @ScriptDir)
Exit


Alors maintenant il faut bien entendu modifier le script. Ou plutôt de rajouter une petite ligne :
RUNAS /USER:%1@MONDOMAINE:%2
REM %1 = login
REM %2 = mot de passe


Plus simple... Et surtout les scripts sont réutilisable.

P.S. : fait à chaud... Je n'ai pas testé ! Si des erreurs subsistent n'hésitez pas !


AutoIt : créer un sondage

, , , ...

Dans les très petites entreprises, déployer un système de sondage est assez fastidieux... Mais surtout onéreux.

Toutefois, il y a des moyens gratuits et puis il y a le bricolage par le développement d'un petit outil... Regardons comment cela se passe !

Définissons en premier temps les propriétés de l'exécutable
; *********************************************************
; Propriétés de l'exécutable
; *********************************************************
#Region
#AutoIt3Wrapper_Version=dev
#AutoIt3Wrapper_outfile=eiq.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_Description=Logiciel d'enquête
#AutoIt3Wrapper_Res_Fileversion=0.0.1.1
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=© Groumphy 2008
#AutoIt3Wrapper_Res_Language=2060
#AutoIt3Wrapper_Res_Field=Company|Privé
#AutoIt3Wrapper_Icon=monIcone.ico
#EndRegion


Les obligatoires :
#NoTrayIcon
#include <GUIConstants.au3>


Les variables
; *********************************************************
; Déclaration des variables
; ********************************************************* 
Dim $s_fichierINI = "parametres.ini"
Dim $s_fichierResultat = "enquete.txt"
Dim $s_lectureSectionUtilisateur = IniReadSection($s_fichierINI, "UTILISATEURS")
Dim $i


L'appel des fonctions...
_version("DEV")
_verificationFichierResultat()


Les fonctions...

Vérifie que le nom d'utilisateur se trouvant dans le fichier INI est bien de valeur Y (pour yes), si la valeur est bien Y, lance la GUI pour l'enquête...
Func _routineIdentification()
For $i = 1 To $s_lectureSectionUtilisateur[0][0]
If $s_lectureSectionUtilisateur[$i][0] = @UserName Then
If $s_lectureSectionUtilisateur[$i][1] = "Y" Then _GUI()
Else
;MsgBox(0, "", "Ne rien faire")
EndIf
Next
EndFunc


La GUI principale.
Elle affiche deux labels, une combox qui permet un choix, ce choix est récolté et placé dans un fichier texte.
Func _GUI()
MsgBox(0, "", "lancement GUI")
#Region ### START Koda GUI section ### Form=i:\script\en développement\enquete satisfaction it\gui_enqueteinformatique.kxf
GUICreate("Enquête informatique", 272, 219, 246, 115)
GUICtrlCreateLabel("Afin d'optimiser son efficacité, le service informatique ", 10, 10, 254, 17)
GUICtrlCreateLabel("vous demande de répondre à la question suivante :", 10, 30, 256, 17)
GUICtrlCreateGroup(" Qualité du support : ", 25, 55, 225, 105)
GUICtrlCreateLabel("Veuillez choisir dans la liste déroulante.", 35, 75, 185, 17)
GUICtrlCreateLabel("Quelle est la qualité du support donné ?", 35, 95, 190, 17)
$cbx_ChoixListeDeroulante = GUICtrlCreateCombo("Sélectionnez votre choix", 35, 115, 200, 25, -1, -1)
GUICtrlSetData($cbx_ChoixListeDeroulante, "Excellente|Très bonne|Bonne|Médiocre|Très mauvaise")
GUICtrlSetTip($cbx_ChoixListeDeroulante, "Faite votre choix dans la liste déroulante")
GUICtrlSetCursor ($cbx_ChoixListeDeroulante, 0)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btn_Valider = GUICtrlCreateButton("&Valider", 160, 175, 100, 33, 0)
GUICtrlSetTip($btn_Valider, "Valider l'enquête informatique")
GUICtrlSetCursor ($btn_Valider, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
;Case $cbx_ChoixListeDeroulante
Case $btn_Valider
$cbx_ChoixListeDeroulante = GUICtrlRead($cbx_ChoixListeDeroulante)
If $cbx_ChoixListeDeroulante = "Sélectionnez votre choix" Then
MsgBox(0 + 32, "Information", "Vous n'avez effectué aucun choix dans la liste déroulante.")
Else
MsgBox(0, "Tracking", "Choix : " & $cbx_ChoixListeDeroulante)
GUISetState(@SW_HIDE)
; Lancer l'écriture dans un fichier texte !!
Dim $s_OuvertureFichier
$s_OuvertureFichier = FileOpen($s_fichierResultat, 1)
FileWriteLine($s_OuvertureFichier, @UserName & @TAB & $cbx_ChoixListeDeroulante)
FileClose($s_OuvertureFichier)
_ChangeValeurINI("N")
MsgBox(0, "", "Valeur changée en N, sortie")
EndIf
EndSwitch
WEnd
EndFunc


Une fonction permettant de changer la valeur du nom d'utilisateur... Le plus simple possible.
Func _ChangeValeurINI($s_Valeur)
IniWrite($s_fichierINI, "UTILISATEURS", @UserName, $s_Valeur)
EndFunc


Fonction vérifiant la présence des fichiers obligatoires...
Func _verificationFichierResultat()
If NOT FileExists($s_fichierResultat) Then 
MsgBox(0, "Erreur", "Pas de fichier résultat !")
Exit
ElseIf NOT FileExists($s_fichierINI) Then
MsgBox(0, "Erreur", "Pas de fichier d'initialisation")
Exit
Else
_routineIdentification()
EndIf
EndFunc


Une fonction Goonie pour débuter et vérifier l'état d'avancement de la fonction...
Func _version($s_typeVersion)
If $s_typeVersion = "DEV" Then
$s_typeVersion = "Le logiciel lancé est en devélopement et est présenté à titre d'idée. V.DEV"
ElseIf $s_typeVersion = "ALPHA" Then
$s_typeVersion = "Le logiciel lancé est en développement et nécessite encore des améliorations " & @CR & _
"toutefois il est parfaitement exploitable. V.ALPHA"
ElseIf $s_typeVersion = "BETA" Then
$s_typeVersion = "Le logiciel lancé est en version de test et nécessite encore des corrections " & @CR & _
"Merci de faire un feedback à xxxx. V.BETA"
ElseIf $s_typeVersion = "PROD" Then
$s_typeVersion = ""
EndIf
If NOT $s_typeVersion = "" Then
MsgBox(0 + 64, "Information", $s_typeVersion)
EndIf
EndFunc


Simple et efficace. C'était une simple idée. Mais elle est fonctionnelle. C'est le principal.

Mais que contiennent les autres fichiers ?
Le fichier INI :
[UTILISATEURS]
USER1=Y
USER2=Y
# on continue les utilisateurs au fur et à mesure, 
# seul le login compte. La valeur N ne fera aucun effet sur la fonction


Le fichier résultats comportera les valeurs suivantes :
USER1 (espace blanc, tabulation...) CoteDonnées (ici Médiocre, bonne, excellente...)
USER2 Bonne
USER3 Excellente


Les résultats du fichier texte sont utilisables dans un tableur, une base de données, etc.
Pour lancer l'enquête, il faut placer simplement un appel dans le NETLOGON pourquoi pas...

Qu'en pensez-vous ?

AutoIt : rechercher sur Google

, ,

Pourquoi n'y ai-je pas pensé avant ?

#Include <IE.au3>

Dim $s_iptBox
$s_iptBox = InputBox("Recherche Google","Que désirez-vous chercher sur Google ?")
_GoogleSearch($s_iptBox)
Exit

Func _GoogleSearch($strSearch)
    Local $o_IE
    $strSearch = StringReplace($strSearch," ","+")
    $o_IE = _IECreate ("http://www.google.com/search?hl=en&q=" & $strSearch)
EndFunc


Simple, mais plutôt efficace.

AutoIt : interface conviviale

, ,

AutoIt dans sa version 3 permet de faire des interfaces graphiques. Ce n’est un secret pour personne.
Toutefois il y a des leçons à tirer sur les GUI (interface graphique) afin de les rendre conviviales.
Passons en revue quelques méthodes simples.
Créons une feuille.
#include <GUIConstants.au3>
$GUI_NomFeuille = GUICreate("Nom de la feuille", 340, 210, -1, -1)
GUISetState(@SW_SHOW)

Que pouvons-nous constater ?
  1. nous utilisons des valeurs rondes pour la dimension de la feuille ;
  2. nous laissons l’emplacement de la feuille par défaut ;
  3. la feuille est nommée d’un nom compréhensible de l’endroit où elle se trouve ou de l’action qu’elle mène (exemple : Aide si c’est la feuille Aide etc.)

Identiquement à une interface web, nous pouvons rajouter un (des) menu(s).
$mn_Fichier = GUICtrlCreateMenu("&Fichier")
$ssMn_Ouvrir = GUICtrlCreateMenuItem("&Ouvrir", $mn_Fichier)
$ssMn_Quitter = GUICtrlCreateMenuItem("&Quitter", $mn_Fichier)
$MenuItem1 = GUICtrlCreateMenu("&Aide")
$ssMn_APropos = GUICtrlCreateMenuItem("A &propos", $MenuItem1)
$ssMn_Aide = GUICtrlCreateMenuItem("A&ide", $MenuItem1)

Que pouvons-nous remarquer ?
  1. nous utilisons des noms de menu dit « classique » (tel Fichier, A propos) ;
  2. les sous-menus sont eux aussi de noms « classique » ;
  3. chaque menu et sous-menu dispose d’une clé d’accès (éperluette devant la lettre servant de clé d’accès) ;
  4. les menus sont placés dans un ordre logique rappelant les logiciels les plus connus (par exemple Fichier suivis de Editions, suivis de Affichage, suivis de A propos/Aide etc.) ;

Une interface graphique permet la plupart du temps de faire de nombreuses actions. Il est généralement conseillé de grouper les actions similaires ou de séparer les types d’actions.
Cela se fait généralement par un groupe.
Créons en un :
$Gp_GroupeAction = GUICtrlCreateGroup(" Groupe de l'action : ", 10, 10, 320, 65)
GUICtrlCreateGroup("", -99, -99, 1, 1)

Nous pouvons dire d’emblée les choses suivantes :
  1. le groupe est créé et fermé ;
  2. des valeurs rondes sont utilisées sur le groupes ;
  3. des valeurs logiques sont utilisées pour placer le groupe mais aussi pour déterminer sa largeur (ainsi je place mon groupe à 10 pixels du bord de la feuille mais je sais aussi que sa fin sera « amputée » de 10 pixels du bord droit de la feuille ; ce qui nous fait la largeur de la GUI [340] soustraite des 10 du bord gauche et du bord droit ce qui nous donne 320 en largeur) ;

Dans le groupe nous pouvons placer différents éléments. Notamment des « labels » et des boutons qui permettent de faire des actions.
 $btn_Ouvrir = GUICtrlCreateButton("&Ouvrir", 200, 32, 110, 30, 0)
GUICtrlSetTip($btn_Ouvrir, "Ouvrir un fichier dans la mémoire")
GUICtrlSetCursor ($btn_Ouvrir, 0)
$lbl_BtnOuvrir = GUICtrlCreateLabel("Ouvrir un fichier dans la mémoire", 20, 40, 160, 20)

Ici aussi quelques petits détails doivent nous sauter aux yeux :
  1. nous utilisons toujours des valeurs rondes ;
  2. les contrôles d’actions disposent d’une infobulle ;
  3. les contrôles d’actions disposent d’un autre curseur que celui de l’interface graphique ;
  4. pour déterminer les infobulles et le curseur nous n’utilisons pas la valeur par défaut (égale à -1) mais bien le nom de la variable qui détermine le contrôle ;

Les boutons placés en bas de la GUI, hors de tout groupes, non accompagné de label, etc. seront les boutons généraux (par exemple : Quitter, Aide, etc.) et bien souvent repris dans le menu Fichier.

Comme vous l’aurez compris, pour avoir une interface graphique agréable, l’homogénéité devra être présente, l’accessibilité tout autant (via les clés d’accès) etc.

En parlant d’accessibilité, il est bon de rappeler qu’il est correct de mettre des données incorrectement introduite dans une autre couleur… Toutefois qui ne vous dit pas que la personne qui utilise votre script ne confond pas les couleurs ?

Il serait tout aussi correct (par exemple) d’utiliser la couleur et des astérisques pour informer que les données ne sont pas correctes.

Nous pourrions par exemple utiliser une routine de ce type sur un Input :

Création de l’Input
 $gp_GroupeAction2 = GUICtrlCreateGroup(" Encodage du nom : ", 10, 85, 320, 65)
$btn_Verifier = GUICtrlCreateButton("&Vérifier", 200, 105, 110, 30)
GUICtrlSetTip(-1, "Vérifier les données encodées")
GUICtrlSetCursor (-1, 0)
$ipt_EncoderNom = GUICtrlCreateInput("Encoder votre nom", 20, 110, 170, 20)
GUICtrlSetTip(-1, "Encodez votre nom et poussez par la suite sur le bouton Vérifier")
GUICtrlCreateGroup("", -99, -99, 1, 1)

La routine de contrôle
Case $btn_Verifier
If GUICtrlRead($ipt_EncoderNom) <> "pwouet" Then
Dim $tmp = GUICtrlRead($ipt_EncoderNom)
GUICtrlSetData($ipt_EncoderNom, "***" & $tmp & "***")
GUICtrlSetColor($ipt_EncoderNom, 0xff0000)
GUICtrlSetData($btn_Verifier, " => Revérifier")
GUICtrlSetColor($btn_Verifier, 0xff0000)
Else
MsgBox(0 + 64, "Information", "Données encodées correcte.")
EndIf

Il est bon de retenir que ce qui s’applique sur le web, s’applique sur les GUI… Tous les trucs, astuces, modes sont bons pour pouvoir donner une « consistance » à une interface graphique !

Installation d’imprimante par script AutoIt

, , , ...

Dans un réseau d’entreprise, il n’est pas rare qu’on utilise encore les script en MS-DOS pour installer une imprimante. Cela se fait grâce à l’utilitaire Con2Prt.exe de Microsoft.

Il suffit alors de composer un petit script dans le style :
REM DEFINITION DES VARIABLES
SET PRTSRV=NOMSERVERIMPRESSION
SET PRTSRVBCK=NOMSERVERIMPRESSIONBACKUP
CHANGE CLIENT /DEFAULT_PRINTERS
REM SUPPRESSION IMPRIMANTE
%LOGONSERVER%\NETLOGON\CON2PRT.EXE /F
IF %CLIENTNAME%==NOMDELASTATION Goto NOMSIGNET
:AUTRES
%LOGONSERVER%\NETLOGON\CON2PRT.EXE /CD \\%PRTSRV%\NOMDEPARTAGE
GOTO END
:NOMSIGNET
%LOGONSERVER%\NETLOGON\CON2PRT.EXE /CD \\%PRTSRV%\NOMDEPARTAGE
GOTO END
:END

EXIT

Toutefois il y a moyen de faire cela plus sympathiquement : j’entend en AutoIt…
Passons en revue deux manières simples.
La première est d’utiliser similairement l’application CON2PRT.EXE de Microsoft, la seconde la DLL permettant l’installation d’une imprimante réseau : PRINTUI.DLL.

Vu que nous pouvons tout aussi bien utiliser le nom de la machine ou le nom d’utilisateur, et vu que j’ai déjà présenté dans le script MS-DOS que c’était le nom de la machine, changeons cela avec le nom d’utilisateur.
Décentralisons nos informations dans un fichier INI tel :
[SERVERS]
PRINTSERVER=NomDuServerImpression
LOGONSERVER=LogonServer
[USERNAME]
GROUMPHY=Imprimante1|Imprimante2
GROUMPHY2=0

Groumphy et Groumphy2 sont les noms d’utilisateurs standards…
Enregistrons ce fichier.
Commençons par définir ce fichier en variable.
Global Const $s_INI = "InstImpNetLogon.ini"

Si nous utilisons CON2PRT.EXE rajoutons pourquoi pas :
Global Const $s_C2P = "con2prt.exe"

Rajoutons une structure pour pouvoir vérifier la présence de nos fichiers nécessaire :
Func _test()
            If NOT FileExists(@ScriptDir & "\" & $s_INI) Then _error($s_INI)
            If NOT FileExists(@ScriptDir & "\" & $s_C2P) Then _error($s_C2P)
EndFunc
Func _error($param1)
            MsgBox(0 + 16, "Error", "Fatal Error. Application 'Core' File Not Found." & @CR & _
                                                                                  "Error Code : " & @ScriptLineNumber & @CR & _
                                                                                  "File Code : " & $param1 & " not found." & @CR & @CR & _
                                                                                  "Please contact your System Administrator",10)
            Exit
EndFunc

Avant de commencer il est bon de supprimer toutes les imprimantes (identiquement à notre script MS-DOS).
Func _deletePrt()
            RunWait(@ScriptDir & "\" & $s_C2P & " /f")
EndFunc

Et de poser les variables :
Global Const $s_PrtServer = IniRead($s_INI, "SERVERS", "PRINTSERVER", "")
Global Const $s_LogonServer = IniRead($s_INI, "SERVERS", "LOGONSERVER", "")
Dim $s_UserName, $s_iniRead, $s_Compteur
            $s_UserName = @UserName
            $s_iniRead = IniRead($s_INI, "USERNAME", $s_UserName, "")
            $s_iniRead = StringSplit($s_iniRead, "|")

Parfais. La structure de base est en place.
Comme vous pouvez le constater dans le fichier INI j’ai mis « 0 » pour l’utilisateur Groumphy2. « 0 » m’indique que je ne dois pas installer d’imprimante.
Faisons une petite structure conditionnelle de ce type alors :
If $s_iniRead[1] = 0 Then
            MsgBox(0 + 64, "Information", "No printers to install... Exit of script.", 10)
            Exit
EndIf

Mais si nous devons installer des imprimantes, il nous faut une boucle permettant de faire cela :
$s_Compteur = 0
Do
            $s_Compteur = $s_Compteur + 1
            _installPrt($s_iniRead[$s_Compteur])
Until $s_Compteur = $s_iniRead[0]

Dans cette boucle, j’appele la function _installPrt que voiçi :
Func _installPrt($param2)
            RunWait("\\" & $s_LogonServer & "\" & $s_C2P & " /c " & "\\" & $s_PrtServer & "\" & $param2)
EndFunc

Et il ne faut rien de plus.

Pour maintenant rajouter un nouvel utilisateur nous n’aurons plus qu’à changer le fichier INI.

Nous avons aussi la possibilité de définir l’imprimante par défaut. Pour ce faire il suffit de rajouter une structure conditionnelle dans la fonction _installPrt pour que la première imprimante prise dans la zone de mémoire soit celle par défaut (installable avec /CD en place de /C).

Pour installer l’imprimante avec PRINTUI.DLL nous ferons exactement de même… Sauf que nous aurons la commande suivante :
$comm = RunWait("rundll32 printui.dll,PrintUIEntry /in /q /n\\" & $s_PrtServer & "\" & $param2, "", @SW_HIDE)


Plus simple, nous ne pouvons le faire. Cela fonctionne correctement en pratique…

AutoIt : récupérer les arguments

, , , ...

En regardant encore les scripts qui sont fournis nativement dans AutoIt, et notamment l'excellent AutoUpdateIt, j'ai découvert une petite fonction assez sympathique servant à récupérer les arguments passé en ligne de commande à un exécutable.

; Auteur : Rob Saunders
; Original script : AutoUpdateIt
Func _StringInArray($a_Array, $s_String)
Local $i_ArrayLen = UBound($a_Array) - 1

For $i = 0 To $i_ArrayLen
If $a_Array[$i] = $s_String Then
Return $i
EndIf
Next
SetError(1)
Return 0
EndFunc


Pourquoi réinventer la roue ?
Alors comment fonctionne-t-il ?

Très simplement :

  • Dans le script AutoIt :
    If _StringInArray($CmdLine, "/coucou") Then MsgBox(0, "", "Coucou trouvé !")
    

  • Lancement en ligne de commande (si le script s'appelle test.exe) :
    C:\chemin_complet>test.exe /coucou
    



Pratique mais rarement utilisé toutefois !

AutoIt : les clés d'accès

, , , ...

A l'image d'un site internet, une interface graphique doit pouvoir facilement se manipuler au clavier.
Il existe donc quelques trucs et astuces de pouvoir intégrer dans votre interface graphique des « clés d'accès », des ordres de tabulations etc.

Les différents contrôles permettant d'être activés au clavier sont les suivants : GUICtrlCreateMenu (pour la création d'un menu), GUICtrlCreateMenuItem (pour un élément d'un menu précédemment créé), GUICtrlCreateRadio, GUICtrlCreateTab (pour l'interface contenant les tabulations), GUICtrlCreateTabItem (pour les différents éléments de tabulation), GUICtrlCreateButton et GUICtrlCreateCheckBox.

Par la suite dans l'interface graphique il y a moyen de déterminer un ordre de tabulation sur les contrôles.

Voyons comment faire en détail :
$filemenu = GUICtrlCreateMenu ("&File")
$fileitem = GUICtrlCreateMenuitem ("&Open",$filemenu)


Cela se fait simplement et uniquement via l'esperluette ! En effet, identiquement au Visual Basic, Visual Basic for Application, la clé ou l'entrée d'accès au contrôle se fait de manière identique. Il faudra pour l'avoir (par exemple ci-dessus le menu) pousser sur la touche Alt de votre clavier qui mettra en valeur (soulignement) les lettres permettant l'accès à la touche, au bouton, au menu etc.

Concernant l'ordre de tabulation, il est paramétrable dans le Koda Interface Designer... Lorsque vous éditez les propriétés ou lorsque votre interface utilisateur (GUI) contenant les contrôles est terminée, faîtes-y un simple clic avec le bouton droit de la souris et choisissez l'option Tab Order.

Pourquoi créer une telle opérationnalité ? Comme vous le savez la rapidité du clavier n'est plus à démontrer, cela donnera un gain de rapidité ; mais aussi du professionnalisme à votre interface de script / application. Mais le plus important reste l'utilisabilité ainsi que l'accessibilité de celle-ci... Votre but premier.

Teasing : la fin

, , , ...

Je vous annonçait depuis quelques temps un petit teasing qui était en cours sur mon blog. J'y avais dispersé quelques indices et... Rien ne fut trouvé.

Mais où étaient-ils ?
Dispersé sur la colonne de droite, il y avait des « countdown » (décompte), quelques renseignements sur un nouveau blog (la barre latérale se met à jour avec les flux RSS)...

Et plein d'autres petites choses de ce style. Cela conforte donc l'idée que bien souvent seul le contenu est lu (le plus souvent par le flux, rarement par le blog) et que tout ce qui est autour est « skippé » !

Mais qu'ai-je donc à vous annoncer ? La diminution des fautes d'orthographe ? Certainement pas.
Alors voici :

#Include <Date.au3>
Dim $acc, $delai, $alphabet, $msg1, $msg2
$acc = _DateToDayValue("2008","05","28")
Select
    Case ($acc - 31) < $acc
        SplashTextOn("Patienter", "Veuillez encore quelques temps 
patienter, " & @CR & _
                    "Construction en cours...", -1, -1, -1, -1)
        While ($acc - 31) < _DateToDayValue(@YEAR, @MON, @MDAY) > ($acc 
- 14)
            Sleep(1000)
        WEnd
        SplashOff()
    Case ($acc - 14) < _DateToDayValue(@YEAR, @MON, @MDAY) > ($acc + 14)
        SplashTextOn("Ouin", "Les jours sont comptés, cela " & _
                        "peut arriver d'une minute à l'autre !" & @CR & _
                        "Albine & Xavier sont heureux de " & _
                        "vous annoncer la venue au monde de ...")
        While ($acc - 14) < _DateToDayValue(@YEAR, @MON, @MDAY)
            Sleep(1000)
        WEnd
        SplashOff()
    Case $acc = _DateToDayValue(@YEAR, @MON, @MDAY)
        MsgBox(0 + 64, "Ouin !", "Albine et Xavier sont heureux " & _
                    "de vous annoncer la venue au monde de ..." & @CR & _
                    "Les autres informations, ne peuvent vous " & _
                    "être divulguée maintenant")       
EndSelect


Vous ne pensiez quand même pas que j'allais vous annoncer cela aussi facilement... Toutefois vous pouvez facilement comprendre en lisant le code :wink:

Futur(e) geek(ette) ? :D
Et qui dit tel événement dit une naissance digitiale aussi... Neuf mois et trois !

AutoIt

, , , ...

Je l'avais promis, voici le « feedback » du pourquoi du comment que j'utilise AutoIt.

Le but initial était d'avoir un langage de script performant et non dépendant de l'éditeur du système d'exploitation Microsoft (sinon j'aurais pris VBS) afin d'automatiser simplement certaines actions sur le PC, le réseau, l'AD.

J'ai bien entendu cherché divers languages (aussi au niveau BATCH), mais je suis rapidement tombé sur le charme de AutoIt car il permettais non seulement d'être son propre language, mais aussi de la combiner avec d'autres (notament le VBS, les DLL et les ActiveX).

Je l'ai donc installé sur un PC portable de type ACER 1700 sous Microsoft Windows XP et l'installation s'est déroulée sans incident particulier. D'ailleur les installeurs sont fait via des logiciels libres (NSIS de NullSoft). Le language se « décompose » en 3 ou 5 paquets selon ce que l'on désire : le language seul (version production et beta) avec son éditeur (SciTE), le language (production et beta), l'éditeur (SciTE), le CVS (CVSWrapper Add-on) accompagné de Tortoise et le dernier package WinMerge qui permet de faire les comparaisons de fichiers.
J'ai choisis en premier temps la « version 3 paquets », et suis passé rapidement à la version 5 paquets car je la trouvais très pratique !

L'éditeur SciTE remplit parfaitement son role avec une aide syntaxique, une aide (fichier CHM) relié à la touche F1, etc. et se montre très (voir trop) complet (mais c'est aussi personnalisable). Bien entendu les autres logiciels sont parfaitement intégré et s'ouvrent en nouvelle fenêtre ; un petit inconvéniant toutefois devant la multitude de fenêtre.

Il a parfaitement remplis ses fonctions jusqu'à maintenant mais les a aussi remarquablement dépassé car dans sa v3 (actuelle) il permet d'avoir des GUI et donc de faire des applications complètes (exécutable etc.).

Je le considère donc autrement qu'un language script mais bien comme un language complet ! Et je ne compte pas m'en séparer de si tôt !

Logiciel libre

, , , ...

A l'image de quelques blogueurs et à l'initiative de Moosh, voici aussi une liste non exhaustive de logiciel libre que j'utilise.
  • OpenOffice : doit-on encore présenter cette célèbre suite logicielle ?
  • Gimp : il remplace parfaitement Adobe Photoshop, couteux, lourd, etc.
  • AutoIt : LE language de script sous Microsoft Windows ! Absolument la Royce-royce de tout ce qui fait dans le scripting sos Microsoft Windows ;
  • Scite : un éditeur de texte, multilanguage avec coloration syntaxique, adapté tant pour Python, AutoIt, HTML, Javascript ou autre !
  • NVu : encore un peu dur de prise en main mais il convient parfaitement pour tout developpeur web, fantastique mais dommage qu'il soit aussi sobre
  • Thunderbird : bien que je n'apprécie pas son interface je le trouve très bien réalisé, simple, économe... Que demander de plus ?
  • Firefox : identique à OpenOffice... Que dire de plus ? Que je le laisse souvent tomber pour Opera ? Mais je ne m'en cache pas !
  • Gaim Pidgin : remplace le très scabreux MSN Windows Live
  • Thingamablog : mon ancienne plateforme de blog... Mais tout en statique, dommage et tant mieux
  • VLC : parfait et idéal pour la vidéo, le streaming, enfin tout ce qui est multimédia audio ou vidéo
  • GanttProject et OpenWorkBench : les logiciels pour la gestion de projet ! Le premier est très simple, le second est un clone de Microsoft Project ;
  • Ubuntu : est placé sur mon second PC... Il me sert à découvrir cet OS que je trouve fantastique
  • TortoiseCVS : très utile pour le versionning des applications et script que je crée (principalement dans AutoIt, couplé à Scite4Autoit) ;
  • WinMerge : idéal pour voir les adaptations faites entre deux codes, couplé lui aussi à TurtoiseCVS, Scite4AutoIt et évidement AutoIt ;
  • Notepad++ : quand j'en ai marre de Scite, il supporte aussi plus de language je trouve...
  • Notepad2 : quand j'en ai marre de Notepad++ :smile: Eh oui on a jamais assez d'éditeur !!
  • Inno SetUp : le logiciel que j'utilise comme installeur pour mes scripts et applications ;
  • ZazouMiniWebServer : un serveur web complet de 300Ko ? Suffit de demander, et adaptable avec PHP/MySQL pour 10Mo... Ou ais-je mis mes prozacs ?

Bien entendu, j'ai déjà testé SPIP, Dotclear, Typo qui sont aussi des logiciels libres mais pas à longue haleine.

Je n'ai pas plus commenté que cela les applications que j'utilise car certaines sont plus que connues. Les autres sont spécifiques... Et les sites Web sont très bien fait.

Edit : vous savez pourquoi !

AutoIt : module de téléchargement

, ,

Alors que je m’amuse à développer un script d’installation automatisé pour ZazouMiniWebServer, je me dis que je peux faire partager celui-ci déjà avancé principalement sur les fonctions opérationnelles.

Nous partons alors du principe que les fichiers se trouvent sur un serveur distant, sous la même arborescence qu’il devrait se trouver afin de la reconstruire sur le PC. Bien entendu vous vous douter que ceci ne fonctionne que pour les applications indépendantes (application portable ou « standalone »).

Continuons. Après avoir hébergé votre application sous la même structure sur un espace Web, il faut maintenant que celle-ci se télécharge dans un dossier choisis par l’utilisateur tout en recréant la même structure.

Zen.

Alors je pense que la première chose que je ferais ce serait une petite GUI toute simple :
#Region ### START Koda GUI section ### Form=
$gui_Installation = GUICreate("Installation de ZLAAM", 355, 135, -1, -1)
$gp_SelectionDossier = GUICtrlCreateGroup(" Dossiers : ", 10, 16, 335, 73)
$btn_Dossier = GUICtrlCreateButton("&Dossier...", 230, 41, 110, 31, 0)
$lbl_Dossier = GUICtrlCreateLabel("Sélectionnez le dossier de téléchargement", 20, 48, 203, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$btn_Installer = GUICtrlCreateButton("&Installer", 230, 96, 110, 31, 0)
GUISetState(@SW_SHOW, $gui_Installation)
#EndRegion ### END Koda GUI section ###

Par la suite, je ferais la boucle d’affichage :
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
exitScript(); Sortie du script
Case $btn_Dossier
choixDossier() ; définition du choix de dossier de l'installation
Case $btn_Installer
GUISetState(@SW_HIDE, $gui_Installation); Je cache la GUI
verifierDossier(); Vérification de la variable $u_DossierSelect
creationStructure() ; Création de la structure des répertories
verificationConnexion() ; Lancement de la vérification de connexion
telechargementComposant(); Lancement du téléchargement des différents composants
EndSwitch
WEnd
Exit

Et enfin les différentes fonctions.
Evidement une des premières fonctions à créer est le test de la connexion :
Func verificationConnexion()
ProgressSet(4, "Vérification de la connexion", "Téléchargement")
Dim $s_Ping
Sleep(1000)
$s_Ping = Ping("www.google.com", 1000)
If NOT $s_Ping Then
Dim $s_MsgPing
$s_MsgPing = MsgBox(4+32, "Information", "La vérification de la connexion semble avoir échoué, " & @CR & _
"Vérifier si vous êtes connecté et si votre pare-feu permet l'accès au réseau ; " & @CR & _
"Désirez-vous continuer ?")
If $s_MsgPing = 7 Then
abandonProcedure()
EndIf
Else
ProgressSet(4, "Connexion réussie")
Sleep(1000)
EndIf 
EndFunc

Par la suite une simple petite routine pour avoir le chemin de téléchargement et d’installation :
Func telechargementFichier($s_URIpath, $s_nomFichier, $s_pc)
Dim $s_tailleFichier, $s_URIcomplete, $s_cheminComplet
MsgBox(0, "", "Track : entrée fonction Func telechargementFichier" & @CR & _
"$s_URIpath = " & $s_URIpath & @CR & _
"$s_nomFichier = " & $s_nomFichier & @CR & _
"$s_pc = " & $s_pc)
$s_URIcomplete = $s_URI & $s_URIpath & $s_nomFichier
MsgBox(0, "", "Track : $s_URIcomplete = " & $s_URIcomplete)
$s_cheminComplet = $u_DossierSelect & "\" & StringReplace($s_URIpath, "/", "\", 0, 1) ;& $s_nomFichier
;$s_tailleFichier = InetGetSize($s_URI & $s_URIpath & $s_nomFichier); Taille du fichier à télécharger
$s_tailleFichier = InetGetSize($s_URIcomplete)
;MsgBox(0, "", "Track $s_tailleFichier = " & $s_tailleFichier & @CR & _; Tracking d'information
;"Chemin : " & $s_URI & $s_URIpath & $s_nomFichier)
MsgBox(0, "", "Track $s_tailleFichier = " & $s_tailleFichier & @CR & _
"Chemin : " & $s_URIcomplete)
If $s_tailleFichier = 0 Then; si la taille est égale à 0 alors erreur
Dim $s_msgTailleFichier
$s_msgTailleFichier = MsgBox(4+32, "Information","Un problème semble être rencontré pour le téléchargement" & @CR & _
"du fichier " & $s_nomFichier & ", désirez-vous continuer ?")
If $s_msgTailleFichier = 7 Then
MsgBox(0+16, "Erreur", "Abandons de procédure par action utilisateur ; " & @CR & _
"Veuillez reporter l'erreur suivante sur les forums : " & @CR & _ ;"Func telechargementFichier(" & $s_URIpath & "/" & $s_nomFichier & "/" & $s_pc & _
"Func telechargementFichier(" & $s_URIcomplete & " / % " & $s_pc & _
"sur la ligne " & @ScriptLineNumber & " ERROR InetGetSize = 0")
abandonProcedure()
EndIf
EndIf
;$s_destination = $u_DossierSelect & "\" & StringReplace($s_URIpath, "/", "\", 0, 1) ; Remplacement des / par \
;MsgBox(0, "", "Track $s_destination = " & $s_destination); Tracking d'information
MsgBox(0, "", "Track $s_destination = " & $s_cheminComplet)
;If NOT FileExists($s_destination) Then ; vérification de l'existance de l'arborescence
If NOT FileExists($s_cheminComplet)Then
Dim $s_msgDestination
$s_msgDestination = MsgBox(4+32, "Erreur", "Il semble que la structure de téléchargement ne soit pas correcte," & _
@CR & "Désirez-vous continuer ?")
If $s_msgDestination = 7 Then
MsgBox(0+16, "Erreur", "Abandons de procédure par action utilisateur ; " & @CR & _
"Veuillez reporter l'erreur suivante sur les forums : " & @CR & _
"Func telechargementFichier(" & $s_cheminComplet & "/ % " & $s_pc & _
"sur la ligne " & @ScriptLineNumber & " ERROR FileExists = -1 => " & $s_cheminComplet)
abandonProcedure()
EndIf
EndIf
;$s_destination = $s_destination & $s_nomFichier
;MsgBox(0, "", "Track $s_destination (2) = " & $s_destination) ; Tracking d'information
$s_cheminComplet = $s_cheminComplet & $s_nomFichier
MsgBox(0, "", "Track $s_destination (2) = " & $s_cheminComplet)

;$s_URIpath = $s_URI & $s_URIpath & $s_nomFichier
;MsgBox(0, "", "Track $s_URIpath (full) = " & $s_URIpath) ; Tracking d'information
MsgBox(0, "", "Track $s_URIpath (full) = " & $s_URIcomplete) 

; Reprise totale des variables
MsgBox(0, "", "Track" & @CR & @CR & _
"$s_URIcomplete = " & $s_URIcomplete & @CR & _
"$s_cheminComplet = " & $s_cheminComplet & @CR & _
"$s_tailleFichier = " & $s_tailleFichier & @CR)

InetGet($s_URIcomplete, $s_cheminComplet, 1, 1); Téléchargement du fichier
While @InetGetActive; Téléchargement actif
ProgressSet($s_pc, "Téléchargement " & $s_nomFichier & "(" & _; Mise à jour du Progress
@InetGetBytesRead & "/" & $s_tailleFichier & " bytes)")
Sleep(250); Attente
WEnd
EndFunc

Le tour est joué.
Bientôt le script en entier…

AutoIt : imbriquer des fonctions

, ,

Alors que le javascript permet aisément d'imbriquer des fonctions les unes dans les autres, AutoIt ne le permet pas...

Le script suivant :
function chiffre() { 
var x; 
x = prompt('Chiffre entre 0 et 10 \?', '0');
if (x > 10) { function stop() { alert('Num\éro incorrect !'); } ; stop(); }
else { function ok(){ alert('Votre numéro est \: ' + x); } ; ok(); } }

devrait être représenté en AutoIt de la manière suivante :
Func chiffre()
Dim $x
$x =InputBox("Chiffre", "Chiffre entre 0 et 10", "0", "", -1, -1,
-1, -1)
If $x > 10 Then 
Func stop() 
MsgBox(0+16, "Erreur", "Numéro Incorrect")
Exit
EndFunc
EndIf
MsgBox(0+64, "Information", "Votre chiffre est : " & $x)
Exit
EndFunc

Malheureusement cela ne fonctionne pas...

Est-ce une chose de positif pour la clarté du code ? Ou négatif aussi dans le sens de la facilité de compréhension ?
Ce sont de petites questions que je me pose.

En effet lorsque j'utilise « l'imbrication de fonction », je trouve qu'on suit « une logique de pensée directe », ce que l'on a besoin dans la condition ou la structure conditionnelle suit directement sans aller faire référence à une extériorisation ou une fonction se trouvant en fin de fichier.

Certe une facilité de lecture et de compréhension bien souvent utilisée mais aussi au détriment de la compréhension du code. Ce qui est évidement souhaitable dans un cas similaire serait de documenter le code au maximum...
Malheureusement pas fait dans tous les cas.

Pour ou contre l'imbrication de fonction ? C'est une question que je me pose... Je suis résolument pour, mais une partie de moi me dit qu'il ne faut pas le faire pour continuer à le (code) faire évoluer.

Wikipedia

, , , ...

Premier article

Read more...

[ AutoIt ] Arguments de compilation

, , , ...

Définir la langue dans un script compilé

Read more...

[ AutoIt ] Générateur de clé

Un fonction génératrice de clé

Read more...

AutoIt, mise à jour d'application

, , , ...

Construire un script de mise à jour

Read more...

ZazouMiniWebServer & script

, , , ...

ZMWS & ZLAM

Alors que je continue le développement script d'un controleur du serveur web ZazouMiniWebServer, ce dernier viens de sortir en version 1.2.2 stable !

Couplé à PHP, MySQL, il permet d'avoir un environnement web complet pour moins de 10Mb.

Quant au controleur il fait moins de 500Ko, graphiques compris. Il en est à la version 0.4 Alpha et semble correctement fonctionner.

Envie d'en savoir plus ? Visitez les forums ZMWS !
November 2009
M T W T F S S
October 2009December 2009
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 28 29
30