× Aidez la recherche contre le COVID-19 avec votre ordi ! Rejoignez l'équipe PC Astuces Folding@home
 > 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 !


Les bons plans du moment PC Astuces

Tous les Bons Plans
-31%Jusqu'à -31% sur la gamme Surface de Microsoft
Valable jusqu'au 08 Juin

Amazon offre jusqu'à 31% de remise immédiate sur une sélection d'ordinateurs portables et de tablettes Microsoft Surface. 


> Voir l'offre
109,90 €Disque dur Western Digital Red 4 To à 109,90 €
Valable jusqu'au 08 Juin

RueDuCommerce propose actuellement le disque dur Western Digital Red 4 To à 109,90 € avec le code WDRED4 alors qu'on le trouve ailleurs autour de 125 €. Ce disque dur 3.5 pouces SATA III est adapté aux NAS et ordinateurs qui fonctionnent 24h/24.


> Voir l'offre
256,99 €Disque dur externe WD Black D10 Game Drive 12 To à 256,99 €
Valable jusqu'au 08 Juin

Amazon fait une superbe promotion sur le disque dur externe WD Black D10 Game Drive 12 To qui passe à 256,99 € livré. On le trouve ailleurs à plus de 350 €. Ce disque dur USB 3.1 est dédié pour gérer et stocker votre bibliothèque de jeux sur Xbox One (d'où le logo sur le boitier) mais il fonctionne également parfaitement bien sur PC et PS4. 3 mois d'abonnement Xbox Game Pass sont aussi offerts. Vous pouvez démonter le disque dur à l'intérieur du boitier pour le réutiliser ailleurs (un HGST DC HC520 12 To vendu plus de 400 € ailleurs)


> Voir l'offre

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