Partagez des fonctions et des UDF AutoIt.
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#1
Message
par TopXm » jeu. 17 nov. 2011 10:18
Bonjour,
J'ai fait une petite fonction se nomme _GetExpandFullPath() et qui permet de traduire les macros autoit (Exemple : @DesktopDir) et autres variables d'environnement dans un chemin de fichier (une chaîne en fait), ça,se trouve ça existe déjà et je suis passé à côté
Les paramètres :
= Chemin du fichier (Ex : %ProgramFiles%\MonDossier\MonFichier.txt)
= Mode :
= Traduction des @Macros et %EnvVar
= Traduction des @Macros@ et %EnvVar% (Par défaut)
= Méthode :
= Ne traduit que les variables d'environnement
= Ne traduit que les macros
= Traduit macros et variables d'environnement
La valeur retournée est le chemin (traduit ou pas) si les paramètres passés sont bons sinon :
@Error = 1 Quand le Chemin du fichier est à blanc
@Error = 2 Quand $iMode n'est pas un valeur valide (1:2)
@Error = 3 Quand $iMethod n'est pas une valeur valide (1:3)
Je me suis très largement inspirée de ce post :
=>
http://www.autoitscript.com/forum/topic ... ntry446159
Je me permet donc de vous solliciter pour avis sur les manques / modifications pouvant être apportées à la fonction
► Afficher le texte _GetExpandFullPath()
Code : Tout sélectionner
;===============================================================================
; Function Name: _GetExpandFullPath()
; Description: Expand FullPath, Expand Environment Variable/macro
;
; Parameter(s): $iPath - String to be expanded.
; $iMode - Expand mode, (Default = 2)
; 1 : expand only %EnvVar/@Macro
; 2 : expand %EnvVar%/@Macro@ and %Env/@Macro (default)
; $iMethod - Expand method, (Default = 3)
; 1 : expand only %EnVar
; 2 : expand only @Macro
; 3 : expand %EnvVar and @Macro (default)
; Requirement(s): None.
; Return Value(s): On success - Return string with expanded variables
; On failure - Set @error to 1 FullPath empty
; Set @error to 2 $iMode invalid
; Set @error to 3 $iMethod invalid
;===============================================================================
; Exemples d'utilisation:
$Var = "%UserProfile\Bureau\TopXm"
$Var1 = "@DesktopDir\TopXm"
$Var2 = "%UserProfile%\Bureau\TopXm"
; Change %EnvVar et @Macro
ConsoleWrite("Mode 1 : Var = " & $Var & @CRLF & "Full=" & _GetExpandFullPath($Var, 1) & @CRLF & @CRLF)
ConsoleWrite("Mode 1 : Var1 = " & $Var1 & @CRLF & "Full=" & _GetExpandFullPath($Var1, 1) & @CRLF & @CRLF)
ConsoleWrite("Mode 1 : Var2 = " & $Var2 & @CRLF & "Full=" & _GetExpandFullPath($Var2, 1) & @CRLF & @CRLF)
; Change %EnvVar/%EnvVar% et @Macro/@Macro@
ConsoleWrite("Mode 2 : Var = " & $Var & @CRLF & "Full=" & _GetExpandFullPath($Var, 2) & @CRLF & @CRLF)
ConsoleWrite("Mode 2 : Var1 = " & $Var1 & @CRLF & "Full=" & _GetExpandFullPath($Var1, 2) & @CRLF & @CRLF)
ConsoleWrite("Mode 2 : Var2 = " & $Var2 & @CRLF & "Full=" & _GetExpandFullPath($Var2, 2) & @CRLF & @CRLF)
; Change %EnvVar/%EnvVar%
ConsoleWrite("Mode 3 : Var = " & $Var & @CRLF & "Full=" & _GetExpandFullPath($Var, 2, 1) & @CRLF & @CRLF)
ConsoleWrite("Mode 3 : Var1 = " & $Var1 & @CRLF & "Full=" & _GetExpandFullPath($Var1, 2, 1) & @CRLF & @CRLF)
; Change @Macro/@Macro@
ConsoleWrite("Mode 4 : Var1 = " & $Var1 & @CRLF & "Full=" & _GetExpandFullPath($Var1, 2, 2) & @CRLF & @CRLF)
ConsoleWrite("Mode 4 : Var2 = " & $Var2 & @CRLF & "Full=" & _GetExpandFullPath($Var2, 2, 2) & @CRLF & @CRLF)
;===============================================================================
; Function Name: _GetExpandFullPath()
;===============================================================================
Func _GetExpandFullPath($iPath, $iMode = 2, $iMethod = 3)
Local $nArrayStr, $nExpand = "", $nMax = 1
If $iPath = '' Then Return SetError(1) ;control param
If $iMode < 1 Or $iMode > 2 Then Return SetError(2)
If $iMethod < 1 Or $iMethod > 3 Then Return SetError(3)
If $iMethod <> 1 Then Local $OldOpt_EVS = Opt("ExpandVarStrings", 0) ;Set environment to 0
If $iMethod <> 2 Then Local $OldOpt_EES = Opt("ExpandEnvStrings", 0)
If $iMethod = 3 Then ;Control $iMethod
Local $nExpandSymb[2] = ["%", "@"]
Else
$nMax = 0
If $iMethod = 1 Then Local $nExpandSymb[1] = ["%"]
If $iMethod = 2 Then local $nExpandSymb[1] = ["@"]
EndIf
Local $RetPath = $iPath ;Split path
If StringInStr($iPath, "\") > 0 Then
$nArrayStr = StringSplit($iPath, "\", 2)
Else
Dim $nArrayStr[1] = [$iPath] ;or Dim array
EndIf
For $A = 0 To $nMax ;For each Symbol
For $B = 0 To UBound($nArrayStr) -1 ;for each Folder/File
If StringLeft($nArrayStr[$B], 1) = $nExpandSymb[$A] Then ;if @Macro or %EnvVar
If StringRight($nArrayStr[$B], 1) = $nExpandSymb[$A] And $iMode = 1 Then ContinueLoop ;Control $iMode
$nExpand = $nArrayStr[$B]
If StringRight($nArrayStr[$B], 1) <> $nExpandSymb[$A] Then $nExpand &= $nExpandSymb[$A]
If $iMethod <> 1 Then Opt("ExpandVarStrings", 1) ;Set environment to 1
If $iMethod <> 2 Then Opt("ExpandEnvStrings", 1)
$nExpand = $nExpand
$RetPath = StringReplace($RetPath, $nArrayStr[$B], $nExpand) ;Replace EnvVar/Macro
If $iMethod <> 1 Then Opt("ExpandVarStrings", 0)
If $iMethod <> 2 Then Opt("ExpandEnvStrings", 0)
EndIf
Next
Next
If $iMethod <> 1 Then Opt("ExpandVarStrings", $OldOpt_EVS) ;Redefine initial Environment
If $iMethod <> 2 Then Opt("ExpandEnvStrings", $OldOpt_EES)
Return $RetPath
EndFunc
Merci d'avance
Tlem
Site Admin
Messages : 11773 Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status :
Hors ligne
#2
Message
par Tlem » jeu. 17 nov. 2011 11:38
Vous serait-il possible de donner un cas concret de l'utilité de cette fonction ?
Car là, en l'état, je ne vois pas.
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#3
Message
par TopXm » jeu. 17 nov. 2011 21:15
Bonsoir
Tlem a écrit : Car là, en l'état, je ne vois pas.
En fait je cherche à traduire certaines variables/macros à travers un script.
Le but final étant de corriger certains problème sur Vista, style ça :
http://www.vista-xp.fr/forum/topic7793.html#p64105
Du coup mon admin(ette) prépare son zip et créée un script qui pourra être utilisé par "l'helpé" et qui ressemble à ça
Code : Tout sélectionner
[Autorisations]
C:\Windows\Winsxs\Manifests ;Définir les autorisations
C:\Windows\Servicing\Packages
[ZipGet] ;Permet de télécharger le fichier zip du serveur au PC de l'helpé
telechargements\Manifests.zip
[unzip] ;Dezippe le contenu du dossier Manifest du ZIP
Manifests\*.*
[UnzipFolder]
@Systemdir\ ;directement dans le dossier concerné
[ZipGet]
telechargements\Packages.zip
Du coup je dois lire le script et interpréter les variables d'environnements / macros
C'est pas très clair mes histoires ... Mais cependant c'est à ça que me sert la fonction
TommyDDR
Modérateur
Messages : 2087 Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status :
Hors ligne
#4
Message
par TommyDDR » mer. 23 nov. 2011 17:31
J'ai aussi eu besoin de transformer les %xxx% d'un chemin en leurs significations, je n'avais pas vu ton post mais j'ai fait... un poil plus court :
► Afficher le texte code
Code : Tout sélectionner
Func GetPathByEnv($Path)
Local $Retour = ""
$Path = StringSplit($Path, "%", 3)
If(Mod(UBound($Path), 2) = 1) Then
$Retour = $Path[0]
For $i = 1 To UBound($Path)-1 Step 2
$Retour &= EnvGet($Path[$i])
$Retour &= $Path[$i+1]
Next
EndIf
Return $Retour
EndFunc
@Tlem : On peut en avoir besoin quand on lis une clé de registre et que celle-ci nous renvoie une valeur du style : "%SystemRoot%\System32\shell32.dll".
Un FileExists nous dira que le fichier n'existe pas ^^.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#5
Message
par TopXm » mer. 23 nov. 2011 18:15
Hello TommyDDR
J'étais aussi parti sur EnvGet au départ mais ça ne réglait pas mon souci initial
Je voulais que mes scripts pré-rédigés n'aient pas besoin d'être modifiés selon l'helpé.
Avec @DesktopDir pas la peine de connaître le nom de l'user ni savoir s'il a XP ou plus récent, @desktopDir ça marche pour tout le monde
Bon en même temps, j'avoue que mettre des @DesktopDir (par exemple) dans des scripts, c'est peut-être un peu tordu comme idée
Tlem
Site Admin
Messages : 11773 Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status :
Hors ligne
#6
Message
par Tlem » mer. 23 nov. 2011 22:28
@TommyDDR
On peut encore simplifier :
► Afficher le texte
Code : Tout sélectionner
Func GetPathByEnv($Path)
Local $ExpandEnvStrings = Opt("ExpandEnvStrings", 1)
Local $Return = $Path
Opt("ExpandEnvStrings", $ExpandEnvStrings)
Return $Return
EndFunc
@TopXm
Idem pour votre fonction. Si le but est d'interpréter les variables d’environnement ainsi que les macros, je doute qu'ont ait réellement besoin de séparer les interprétations ! Et dans ce cas, ceci convient largement (au pire cela vous donnera des idées pour améliorer votre fonction) :
► Afficher le texte
Code : Tout sélectionner
; Exemples d'utilisation:
$Var = "%UserProfile\Bureau\TopXm"
MsgBox(0, "", _GetExpandFullPath($Var))
$Var = "@DesktopDir\TopXm"
MsgBox(0, "", _GetExpandFullPath($Var))
$Var = "%UserProfile%\Bureau\TopXm"
MsgBox(0, "", _GetExpandFullPath($Var))
$Var = "%USERPROFILE%\Bureau\@ScriptName"
MsgBox(0, "", _GetExpandFullPath($Var))
Func _GetExpandFullPath($Path)
Local $Return
Local $SetMacro = StringRegExpReplace($Path, "(@[\w]+)", "@$0@")
Local $SetEnv = StringRegExpReplace($SetMacro, "(%[\w]+)", "%$0%")
Local $ExpandEnvStrings = Opt("ExpandEnvStrings", 1)
Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)
$Res = $SetEnv
Assign ("Return", $Res)
Opt("ExpandEnvStrings", $ExpandEnvStrings)
Opt("ExpandVarStrings", $ExpandVarStrings)
Return $Return
EndFunc
TommyDDR
Modérateur
Messages : 2087 Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status :
Hors ligne
#7
Message
par TommyDDR » jeu. 24 nov. 2011 08:40
Ah, pas mal, merci Tlem
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#8
Message
par TopXm » jeu. 24 nov. 2011 12:27
Bonjour
Tlem a écrit : @TopXm
Idem pour votre fonction. Si le but est d'interpréter les variables d’environnement ainsi que les macros, je doute qu'ont ait réellement besoin de séparer les interprétations ! Et dans ce cas, ceci convient largement (au pire cela vous donnera des idées pour améliorer votre fonction) :
C'est impec comme cela merci
Du coup, je l'ai utilisée pour traduire les différentes commandes DOS que je suis susceptible de trouver dans les scripts, ce qui donne
► Afficher le texte ExpandCommandLine
Code : Tout sélectionner
Local $VarBis[6] = [5, _
"type c:\autoexec.bat > @DesktopDir\%MyFile%", _
"echo. >> @DesktopDir\TopXm.txt", _
"dir @DesktopDir\*.* /s >> @DesktopDir\TopXm.txt", _
"md %LocalAppData%\Tralala >> @DesktopDir\TopXm.txt", _
"notepad @DesktopDir\TopXm.txt"]
Local $ComSpec = @ComSpec & ' /c '
Local $A, $Cmd
EnvSet("MyFile", "TopXm.Txt")
For $A = 1 To $VarBis[0]
$Cmd = $ComSpec & _GetFullCommandLine($VarBis[$A])
ConsoleWrite($Cmd & @CRLF)
; RunWait($Cmd, @ScriptDir, @SW_SHOW)
If @error Then
ConsoleWrite("Bad Cmd : " & $Cmd & @CRLF)
EndIf
Next
EnvSet("MyFile")
Exit
Func _GetFullCommandLine($CmdLine)
Local $TmpCmd[2] = [0]
Local $RetCmd = $CmdLine
Local $CmdString
$TmpCmd = StringSplit($CmdLine, " ")
For $A = 1 To $TmpCmd[0]
If StringLeft($TmpCmd[$A], 1) = '%' Or StringLeft($TmpCmd[$A], 1) = '@' Then ;cas des chemins avec des blancs
$CmdStr = _GetExpandFullPath($TmpCmd[$A])
$RetCmd = StringReplace($RetCmd, $TmpCmd[$A], '"' & _GetExpandFullPath($TmpCmd[$A]) & '"')
EndIf
Next
Return $RetCmd
EndFunc
Func _GetExpandFullPath($Path)
Local $Return
Local $SetMacro = StringRegExpReplace($Path, "(@[\w]+)", "@$0@")
Local $SetEnv = StringRegExpReplace($SetMacro, "(%[\w]+)", "%$0%")
Local $ExpandEnvStrings = Opt("ExpandEnvStrings", 1)
Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)
$Res = $SetEnv
Assign ("Return", $Res)
Opt("ExpandEnvStrings", $ExpandEnvStrings)
Opt("ExpandVarStrings", $ExpandVarStrings)
Return $Return
EndFunc
La fonction _GetFullCommandLine est sans doute "optimisable", quoiqu'il en soit cela fonctionne et j'ai même capté les StringRegExpReplace
Un grand merci à vous deux
TommyDDR
Modérateur
Messages : 2087 Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status :
Hors ligne
#9
Message
par TommyDDR » mer. 18 janv. 2012 16:04
En parlant de ExpandEnvStrings, pourquoi ExpandVarStrings ne marche pas de la même façon (ne marche pas du tout ?) ?
Ce code ne fonctionne pas :
► Afficher le texte code
Code : Tout sélectionner
Global $test = "ok"
Local $Titre = "$test @UserName"
ConsoleWrite(TransformMacroString($Titre) & @CRLF)
Func TransformMacroString($Texte)
Local $opt = Opt("ExpandVarStrings", 1)
Local $retour = $Texte
Opt("ExpandVarStrings", $opt)
Return $retour
EndFunc
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#10
Message
par TopXm » jeu. 19 janv. 2012 09:31
Hello
Assurément le $ lui pose un problème :
Code : Tout sélectionner
; Exemples d'utilisation:
Local $Var
$Var = "\MyFolder\@UserName"
ConsoleWrite('1 :' & _GetExpandFullPath($Var) & @CRLF)
$Var = "\test @UserName"
ConsoleWrite('2 :' & _GetExpandFullPath($Var) & @CRLF)
$Var = "$test @UserName"
ConsoleWrite('3 :' & _GetExpandFullPath($Var) & @CRLF)
Func _GetExpandFullPath($Path)
Local $Return
Local $SetMacro = StringRegExpReplace($Path, "(@[\w]+)", "@$0@")
Local $ExpandVarStrings = Opt("ExpandVarStrings", 1)
$Res = $SetMacro
Assign ("Return", $Res)
Opt("ExpandVarStrings", $ExpandVarStrings)
Return $Return
EndFunc
Pourquoi ? par contre je n'en sais fichtre rien
TommyDDR
Modérateur
Messages : 2087 Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status :
Hors ligne
#11
Message
par TommyDDR » lun. 23 janv. 2012 15:33
Merci pour votre réponse, étrange en effet.
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
mikell
Spammer !
Messages : 6292 Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status :
Hors ligne
#12
Message
par mikell » lun. 23 janv. 2012 16:41
On dirair qu'une variable et une macro ne peuvent pas être gérées dans la même expression
Code : Tout sélectionner
Global $test2 = "ok\"
Local $Titre = $test2 & @UserName
Local $Titre2 = ' "$test2" @UserName '
ConsoleWrite('4 :' & TransformMacroString($Titre) & @CRLF)
ConsoleWrite('5 :' & TransformMacroString($Titre) & @CRLF)
Func TransformMacroString($Texte)
Local $opt = Opt("ExpandVarStrings", 1)
Local $retour = $Texte
Opt("ExpandVarStrings", $opt)
Return $retour
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
TommyDDR
Modérateur
Messages : 2087 Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status :
Hors ligne
#13
Message
par TommyDDR » jeu. 26 janv. 2012 10:50
Pour en revenir au sujet principal...
Comme quoi ce n'est pas inutile de lire les UDFs inclus dans AutoIt
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
TopXm
Niveau 6
Messages : 260 Enregistré le : mer. 25 mai 2011 16:37
Localisation : Cognac !!!
Status :
Hors ligne
#14
Message
par TopXm » jeu. 26 janv. 2012 12:43
Hello
TommyDDR a écrit : Comme quoi ce n'est pas inutile de lire les UDFs inclus dans AutoIt
Oué ça le fait bien en effet
Merci TommyDDR
Code : Tout sélectionner
#include <winapi.au3>
Local $Var= "$test %userprofile%\chupachoups"
ConsoleWrite('==>' & _WinAPI_ExpandEnvironmentStrings($Var) & @CRLF)