> Tous les forums > Forum Autres langages
 VBS, problème de syntaxe
Ajouter un message à la discussion
Page : [1] 
Page 1 sur 1
fgondard
  Posté le 08/06/2018 @ 11:25 
Aller en bas de la page 
Grand Maître astucien

Bonjour,

Je viens de trouver ce script sur la toile :

filePath = BrowseForFile()

If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If

'--------------------------------------------------------------------------------------
Function BrowseForFile()
'@description: Browse for file dialog.
'@author: Jeremy England (SimplyCoded)
BrowseForFile = CreateObject("WScript.Shell").Exec("mshta.exe ""about:<input type=file id=f>" & _
"<script>resizeTo(0,0);f.click();new ActiveXObject('Scripting.FileSystemObject')" & _
".GetStandardStream(1).WriteLine(f.value);close();</script>""" _
).StdOut.ReadLine()
End Function

La fonction permet d'afficher la fenêtre standard de séléction d'un fichier et renvoie le nom complet de celui sélectionné. Le début du script n'est là que pour illustrer le fonctionnement.

Ça fonctionne parfaitement mais l'écriture est particulièrement condensée et j'ai souhaité l'aérer pour mieux comprendre le mécanisme.

J'ai donc cru obtenir le même résultat avec ça :

filePath = BrowseForFile()
If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If
'--------------------------------------------------------------------------------------
Function BrowseForFile()
htafic = "about:<input type=file id=f><script>resizeTo(0,0);f.click();new ActiveXobject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(f.value);close()</script>"
MsgBox htafic
Set MonShell = CreateObject("WScript.Shell")
BrowseForFile = MonShell.Exec("mshta.exe ""htafic""").StdOut.ReadLine()
End Function

Et ... rien ne se passe !

Ce que j'ai cru comprendre sur le fonctionement de la fonction : on lance mshta en lui passant en paramètre une chaîne de caractères sensée repésenter le contenu d'un fichier hta à l'intérieur duquel on exécute un script VBS.

Je n'ai rien trouvé à propos de "about:" mais je suppose que c'est une commande HTML qui permet d'établir un comportement général pour tout ce qui suit et que les indications qu'elle contient auraient tout aussi bien pu être mises dans la balise <script>

Dans le script ;
- on commence par réduire à rien la taille de la fenêtre ;
- on simule un click ;
- on instancie un objet ActiveX et le nom du fichier sélectionné (f.value) est écrit dans la sortie standard ;
- on clos quelque chose, la fenêtre ouverte par mshta je suppose.

La fonction prend la valeur lue dans la sortie standard.

Je n'ai rien trouvé non plus sur le ";" qui apparaît dans le texte du script. Je suppose qu'il sert de séparateur. Il est peut-être possible de jouer avec des VBCrLf à la place de manière à donner au script une allure plus habituelle.

Le Msgbox dans la fonction est de mon cru est n'est là que pour la mise au point.

Il y a sûrement des tas de trucs qui m'échappent et j'aurai bien besoin de vos lumières.

Merci d'avance.



Modifié par fgondard le 08/06/2018 11:26
Publicité
zoulouman
 Posté le 09/06/2018 à 04:11 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
Astucien

Salut,

Désolé, je ne connais pas VBS et ne veux surtout pas utiliser ce langage. Ca fait partie du pire en matière de sécurité chez Microsoft.

Par contre, je peux éclairer ta lanterne sur le point virgule ( ; ).
Dans un langage "normal", le ; met fin à une ligne d'instructions/fonctions.
Selon les langages, il doit être suivi d'un saut de ligne ou peut supporter d'autres instructions/fonctions à la suite.

La bonne pratique veut qu'on passe à la ligne après un ; pour des histoires de lisibilité du code.

Désolé de ne pas pouvoir t'aider plus.

fgondard
 Posté le 09/06/2018 à 14:28 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Grand Maître astucien

Par contre, je peux éclairer ta lanterne sur le point virgule ( ; ).
Dans un langage "normal", le ; met fin à une ligne d'instructions/fonctions.

Merci pour cette précision.

C'est bien ce que j'avais supposé mais je n'ai rien trouvé dans le cas particulier de vbs.

Là on est dans un cas particulier puisque c'est une chaîne de caractères qui doit être vue comme le contenu d'un fichier. D'où la syntaxe peu conventionnelle.

J'ai posé la même question sur un forum plus spécialisé et je ne manquerai pas de rapporter ici le résultat de ma demande.

fgondard
 Posté le 09/06/2018 à 16:37 
Aller en bas de la page Revenir au message précédent Revenir en haut de la page
  Grand Maître astucien

J'avais tout simplement oublié qu'il fallait que je concatène la chaîne représentant le pseudo fichier HTA à la suite du exec. Vite trouvé par un intervenant sur developpez.com. Il restait cependant encore des problèmes de guillemets.

Finalement ma tentative de rendre la chose moins absconse donne ça :

'-------------------------------------
'Récupération nom complet d'un fichier
'-------------------------------------

filePath = BrowseForFile()
If filePath = "" Then
MsgBox "Operation canceled", vbcritical
Else
MsgBox filePath, vbinformation
End If

'---------------------
'Fonction récupération
'---------------------

Function BrowseForFile()

'--------------------
' Pseudo fichier HTA
'--------------------
htafic = """about:<input type=file id=f>" & _
"<script>" & _
"resizeTo(0,0);" & _
"f.click();" & _
"new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1).WriteLine(f.value);" & _
"close()" & _
"</script>"""
'----------------------
' Création objet shell
'----------------------
Set MonShell = CreateObject("WScript.Shell")
'-----------
' Exécution
'-----------
BrowseForFile = MonShell.Exec("mshta.exe " & htafic).StdOut.ReadLine()

End Function

C'est un plus lisible mais ça reste encore un peu mystérieux pour moi. Ma variable htafic a presque l'air d'un fichier. Mais je n'ai jamais travaillé avec des fichiers HTA ni utilisé de contrôles activeX. Il va falloir que je pioche un peu.

Au passage j'ai tenté de remplacer les ";" par des vbcrlf mais ça ne marche pas.

Merci encore pour ton intervention.



Modifié par fgondard le 09/06/2018 16:52
Page : [1] 
Page 1 sur 1

Vous devez être connecté pour poster des messages. Cliquez ici pour vous identifier.

Vous n'avez pas de compte ? Créez-en un gratuitement !


Sujets relatifs
Problème avec affichage dans excel VBA
Problème d'installation sur Visual Studio
Problème avec WinPython - Spyder
syntaxe zone de liste déroulante dans excel 2010
C Problème pointeur et passage en référence.
problème macro excel
Problème avec les espaces C++
Problème pour un batch urgent, veuillez lire svp
problème avec un parametre de requete preparée MVC
Problème de gestion dynamique de JCheckbox
Plus de sujets relatifs à VBS, problème de syntaxe
 > Tous les forums > Forum Autres langages